您的位置:首页 > 编程语言 > Python开发

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

2016-04-13 19:09 1156 查看
续: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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: