首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Python 2.7读写包括unicode在内的CSV文件

使用Python 2.7读写包括unicode在内的CSV文件
EN

Stack Overflow用户
提问于 2013-06-22 06:49:32
回答 5查看 120.7K关注 0票数 72

我是Python的新手,我有一个关于如何使用Python来读写CSV文件的问题。我的文件包含德语、法语等。根据我的代码,这些文件可以在Python中正确读取,但当我将其写入新的CSV文件时,unicode成为一些奇怪的字符。

数据如下:

我的代码是:

代码语言:javascript
运行
复制
import csv

f=open('xxx.csv','rb')
reader=csv.reader(f)

wt=open('lll.csv','wb')
writer=csv.writer(wt,quoting=csv.QUOTE_ALL)

wt.close()
f.close()

结果是这样的:

我应该怎么做才能解决这个问题?

EN

回答 5

Stack Overflow用户

发布于 2014-06-04 19:02:08

另一种选择:

使用unicodecsv包中的代码...

https://pypi.python.org/pypi/unicodecsv/

代码语言:javascript
运行
复制
>>> import unicodecsv as csv
>>> from io import BytesIO
>>> f = BytesIO()
>>> w = csv.writer(f, encoding='utf-8')
>>> _ = w.writerow((u'é', u'ñ'))
>>> _ = f.seek(0)
>>> r = csv.reader(f, encoding='utf-8')
>>> next(r) == [u'é', u'ñ']
True

此模块与STDLIB csv模块的API兼容。

票数 62
EN

Stack Overflow用户

发布于 2013-06-22 11:13:47

确保适当地进行编码和解码。

此示例将utf-8中的一些示例文本往返到csv文件,然后返回以演示:

代码语言:javascript
运行
复制
# -*- coding: utf-8 -*-
import csv

tests={'German': [u'Straße',u'auslösen',u'zerstören'], 
       'French': [u'français',u'américaine',u'épais'], 
       'Chinese': [u'中國的',u'英語',u'美國人']}

with open('/tmp/utf.csv','w') as fout:
    writer=csv.writer(fout)    
    writer.writerows([tests.keys()])
    for row in zip(*tests.values()):
        row=[s.encode('utf-8') for s in row]
        writer.writerows([row])

with open('/tmp/utf.csv','r') as fin:
    reader=csv.reader(fin)
    for row in reader:
        temp=list(row)
        fmt=u'{:<15}'*len(temp)
        print fmt.format(*[s.decode('utf-8') for s in temp])

打印:

代码语言:javascript
运行
复制
German         Chinese        French         
Straße         中國的            français       
auslösen       英語             américaine     
zerstören      美國人            épais  
票数 58
EN

Stack Overflow用户

发布于 2013-06-22 07:20:17

csv module documentation的末尾有一个示例,它演示了如何处理Unicode。下面是直接从该example复制的。请注意,读取或写入的字符串将是Unicode字符串。例如,不要将字节字符串传递给UnicodeWriter.writerows

代码语言:javascript
运行
复制
import csv,codecs,cStringIO

class UTF8Recoder:
    def __init__(self, f, encoding):
        self.reader = codecs.getreader(encoding)(f)
    def __iter__(self):
        return self
    def next(self):
        return self.reader.next().encode("utf-8")

class UnicodeReader:
    def __init__(self, f, dialect=csv.excel, encoding="utf-8-sig", **kwds):
        f = UTF8Recoder(f, encoding)
        self.reader = csv.reader(f, dialect=dialect, **kwds)
    def next(self):
        '''next() -> unicode
        This function reads and returns the next line as a Unicode string.
        '''
        row = self.reader.next()
        return [unicode(s, "utf-8") for s in row]
    def __iter__(self):
        return self

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):
        '''writerow(unicode) -> None
        This function takes a Unicode string and encodes it to the output.
        '''
        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)

with open('xxx.csv','rb') as fin, open('lll.csv','wb') as fout:
    reader = UnicodeReader(fin)
    writer = UnicodeWriter(fout,quoting=csv.QUOTE_ALL)
    for line in reader:
        writer.writerow(line)

输入(UTF-8编码):

代码语言:javascript
运行
复制
American,美国人
French,法国人
German,德国人

输出:

代码语言:javascript
运行
复制
"American","美国人"
"French","法国人"
"German","德国人"
票数 30
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17245415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档