Python 2.7 解决写入文件的中文乱码问题

续:python之xml文件处理的例子-问题描述及解决方法


从一个文件中读入中文字符再写入到另一个文件中,遇到中文乱码问题。学习到一个方法解决这个问题,分享如下。

 

环境: python 2.7

 

背景:待读取的xml文件中含有中文字符。 读入这些字符并写入到csv文件中。 用notepad++打开生成的csv文件能正常显示中文,但若用Excel打开,则中文为乱码。此文解决乱码的问题。

 

准备:准备一个名为test.xml的文件,文件中写几个中文字符即可。

<var>中文</var>

实验:下面是运行成功的代码。

#!/usr/bin/python
# -*- coding: UTF-8 -*-
#date   2016.04.13

import csv
import re
import time
import io
#********************************************
class ReportWriter():
   def __init__(self, item, filename):
      # item is a list to be written into a CSV file
      self.value = item
      self.filename = filename
      self.wirteFormat()    #参见说明1

   # parameter 'value' need to be str
   def updateValue(self, value, idx = -1):
      if idx>=0:
         self.value[idx] = value#.encode('UTF-8')
      else:
         self.value = value#.encode('UTF-8')

   def wirteFormat(self):
      fw = io.open(self.filename, 'a', encoding = 'utf-8')    
      fw.write(unicode("\xEF\xBB\xBF", "utf-8"))     #参见说明2
      
   def writeFile(self):
      #print type(self.value)
      fw = io.open(self.filename, 'a', encoding = 'utf-8')     #参见说明3
      fw.write(unicode(self.value, "utf-8"))    #参见说明4
      fw.close()

if ( __name__ == "__main__"):

   filename = 'a.csv'  
   data = '中文'   # -1- 在代码文件中定义的包含中文的字符变量没有乱码的问题。
   
   f = ReportWriter(data, filename)
   #f.writeFile()   #去掉前面的注释运行可以看到 data 变量被正确写入到csv文件,无乱码

   fr = open('test.xml', 'r')    # -2- 打开xml 文件 
   content = fr.read()        # 读取文件内容
   print(content)           # 打印结果正常,无乱码
   f.updateValue(content)    # updateValue() 函数用从xml文件中读到的字符更新ReportWriter类的实例f的value变量

   f.writeFile()              # 接着调用writeFile()函数将从xml文件中读到的字符写入a.csv
   print('done')

说明1:初始化ReportWriter实例f时调用类的wirteFormat()函数。

说明2:wirteFormat()函数将\xEF\xBB\xBF写到文件开头,指示文件为UTF-8编码。

说明3:用io模块中的open函数,指定以UTF-8格式打开。

说明4:writeFile()函数中指定将value转换为unicode后再调writer函数写入文件。

 

Python 3 中字符均使用unicode编码,unicode函数不再需要。

 

结果:用Excel直接打开生成的a.csv文件,中文正常显示,无乱码。


参考:

阮一峰的网络日志 字符编码笔记:ASCII,Unicode和UTF-8

中文字符集编码Unicode ,gb2312 , cp936 ,GBK,GB18030

Python 中文 编码

Python中的str与unicode处理方法

Python chardet 字符编码判断

也谈 Python 的中文编码处理

PYTHON-进阶-编码处理小结

Python3.x 中,chr() 和 ord() 默认支持unicode



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值