总的思路:就是把所有unicode字符转化为utf-8编码格式然后写出文件。(为了节省内存,文件中数据并不直接以unicode格式存储,而是以utf-8存储)
1.向普通文本文件写入Unicode字符
python内置库中的open方法只能读写ascii码,如果想写入Unicode字符,需要使用codecs包
代码示例:
# -*- coding: utf-8 -*-
import codecs
content = u'你好'
f = codecs.open('c:/test.txt', 'w', 'utf-8')
f.write(content)
我们可以看到codecs包中的open函数可以传入编码参数。
2.向csv文件中写入Unicode字符
这里介绍3种方法
(1)使用UnicodeWriter
csv模块文档给出了处理unicode字符串的方法示例
代码示例:
# -*- coding: utf-8 -*-
import csv
import codecs
import cStringIO
# 这个类来自官方文档
class UnicodeWriter:
def __init__(self, f, dialect=csv.excel, encoding="utf-8-sig", **kwds):
self.queue = cStringIO.StringIO()
self.writer = csv.writer(self.queue, dialect=dialect, **kwds)
self.stream = f
self.encoder = codecs.getincrementalencoder(encoding)()
def writerow(self, row):
self.writer.writerow([s.encode("utf-8") for s in row])
data = self.queue.getvalue()
data = data.decode("utf-8")
data = self.encoder.encode(data)
self.stream.write(data)
self.queue.truncate(0)
def writerows(self, rows):
for row in rows:
self.writerow(row)
name = u'BrownWong你好哈哈'
file_name = 'C:\Users\DELL\Desktop\test.csv'
writer = UnicodeWriter(open(file_name, 'wb'), delimiter=',')
writer.writerow([name])
注意:
- 如果是以追加方式写入文件,假设文件存在,请确保此文件格式为utf-8;
- 文件要以二进制模式打开。
(2)使用unicodecsv代替csv
unicodecsv和csv使用方式一样。
import unicodecsv as csv
file_name = 'XX'
writer = csv.writer(open(file_name, 'wb'))
writer.writerow(XX)
(3)setdefaultencoding
在py文件头添加下面3行:
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
并不建议使用这种方式,因为这样将会告诉python你接下来运行的所有代码(包括一些第三方库)都将改变成utf8编码,某些第三方库可能就不能被正常使用了。详见 Why sys.setdefaultencoding() will break code
Ref:
http://stackoverflow.com/questions/17245415/read-and-write-csv-files-including-unicode-with-python-2-7
https://docs.python.org/2/library/csv.html