python中文乱码总结

来源:互联网 发布:车铣复合手工编程实例 编辑:程序博客网 时间:2024/05/29 03:00
环境 Mac 版本 python2.7.14 IDE PyCharm

目录
【问题】python中文写入csv文件乱码(情形一)
【问题】python中文写入csv文件乱码(情形二)
【扩展问题1】——将中文列表row正常输出
【扩展问题2】——将\u转换为对应的中文


【问题】python中文写入csv文件乱码(情形一)

# -*- coding: UTF-8 -*-import csvrow = ['课程', '语文', '数学', '英语']file_name = 'course.csv'file_obj = open(file_name, 'wb')writer = csv.writer(file_obj)for row_temp in row:    print row_tempprint rowwriter.writerow(row)

输出:

课程语文数学英语['\xe8\xaf\xbe\xe7\xa8\x8b', '\xe8\xaf\xad\xe6\x96\x87', '\xe6\x95\xb0\xe5\xad\xa6', '\xe8\x8b\xb1\xe8\xaf\xad']

csv文件为乱码:

璇剧  璇   板   辫

可以看到:
1. 将列表row写入csv文件时,中文为乱码;
2. 直接打印列表row,也不是中文;
3. 单独打印列表row中的元素,正常显示中文。

【原因】
excel能够正确识别用gb2312、gbk、gb18030或utf_8 with BOM 编码的中文,如果是utf_8 no BOM编码的中文文件,excel打开会乱码。

【解决方法】
修改代码如下:

# -*- coding: UTF-8 -*-import csvimport codecsrow = ['课程', '语文', '数学', '英语']file_name = 'course.csv'file_obj = open(file_name, 'wb')file_obj.write(codecs.BOM_UTF8)  # 防止乱码writer = csv.writer(file_obj)for row_temp in row:    print row_tempprint rowwriter.writerow(row)

添加的代码为:

import codecsfile_obj.write(codecs.BOM_UTF8)  # 防止乱码

输出:

课程语文数学英语['\xe8\xaf\xbe\xe7\xa8\x8b', '\xe8\xaf\xad\xe6\x96\x87', '\xe6\x95\xb0\xe5\xad\xa6', '\xe8\x8b\xb1\xe8\xaf\xad']

csv文件正常显示中文:

课程  语文  数学  英语

【问题】python中文写入csv文件乱码(情形二)

row = [u'课程', u'语文', u'数学', u'英语']时,会遇到与上文同样的乱码,解决方法也一样。

u'课程'也可以写成:unicode('课程', 'utf-8')

附上修改后的代码:

# -*- coding: UTF-8 -*-import sysreload(sys)sys.setdefaultencoding('utf-8')  # 没有这句会报错import csvimport codecs# row = ['课程', '语文', '数学', '英语']row = [u'课程', u'语文', u'数学', u'英语']file_name = 'test.csv'file_obj = open(file_name, 'wb')file_obj.write(codecs.BOM_UTF8)  # 防止乱码writer = csv.writer(file_obj)for row_temp in row:    print row_tempprint rowwriter.writerow(row)

输出:

课程语文数学英语[u'\u8bfe\u7a0b', u'\u8bed\u6587', u'\u6570\u5b66', u'\u82f1\u8bed']

csv文件正常显示中文:

课程  语文  数学  英语

【扩展问题1】——将中文列表row正常输出

使用join方法:这种方法的输出结果是一整个字符串。

print ', '.join(row)

输出:

课程, 语文, 数学, 英语

【扩展问题2】——将\u转换为对应的中文

x_str = '\u8bfe\u7a0b'print type(x_str)print x_strprint u'\u8bfe\u7a0b'                   #方法一print x_str.decode('unicode-escape')    #方法二

输出:

<type 'str'>\u8bfe\u7a0b课程课程
原创粉丝点击