从一个文件中读入中文字符再写入到另一个文件中,遇到中文乱码问题。学习到一个方法解决这个问题,分享如下。
环境: 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
Python3.x 中,chr() 和 ord() 默认支持unicode