Python2向文件写入Unicode字符

总的思路:就是把所有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])

注意:

  1. 如果是以追加方式写入文件,假设文件存在,请确保此文件格式为utf-8;
  2. 文件要以二进制模式打开。

(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

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值