环境 | Mac |
---|---|
版本 | python2.7.14 |
IDE | PyCharm |
目录
【问题】python中文写入csv文件乱码(情形一)
【问题】python中文写入csv文件乱码(情形二)
【扩展问题1】——将中文列表row正常输出
【扩展问题2】——将\u转换为对应的中文
# -*- coding: UTF-8 -*-
import csv
row = ['课程', '语文', '数学', '英语']
file_name = 'course.csv'
file_obj = open(file_name, 'wb')
writer = csv.writer(file_obj)
for row_temp in row:
print row_temp
print row
writer.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 csv
import codecs
row = ['课程', '语文', '数学', '英语']
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_temp
print row
writer.writerow(row)
添加的代码为:
import codecs
file_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文件正常显示中文:
课程 语文 数学 英语
当row = [u'课程', u'语文', u'数学', u'英语']
时,会遇到与上文同样的乱码,解决方法也一样。
u'课程'
也可以写成:
unicode('课程', 'utf-8')
附上修改后的代码:
# -*- coding: UTF-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8') # 没有这句会报错
import csv
import 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_temp
print row
writer.writerow(row)
输出:
课程
语文
数学
英语
[u'\u8bfe\u7a0b', u'\u8bed\u6587', u'\u6570\u5b66', u'\u82f1\u8bed']
csv文件正常显示中文:
课程 语文 数学 英语
使用join方法:这种方法的输出结果是一整个字符串。
print ', '.join(row)
输出:
课程, 语文, 数学, 英语
x_str = '\u8bfe\u7a0b'
print type(x_str)
print x_str
print u'\u8bfe\u7a0b' #方法一
print x_str.decode('unicode-escape') #方法二
输出:
<type 'str'>
\u8bfe\u7a0b
课程
课程