环境Mac
版本python2.7.14
IDEPyCharm

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


【问题】python中文写入csv文件乱码(情形一)
# -*- 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文件正常显示中文:

课程  语文  数学  英语

【问题】python中文写入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文件正常显示中文:

课程  语文  数学  英语

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

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

print ', '.join(row)

输出:

课程, 语文, 数学, 英语
【扩展问题2】——将\u转换为对应的中文
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
课程
课程
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐