如何在CSV文件中编写UTF-8

我正在尝试创build一个PyQt4 QTableWidget csv格式的文本文件。 我想用UTF-8编码来编写文本,因为它包含特殊字符。 我使用以下代码:

 import codecs ... myfile = codecs.open(filename, 'w','utf-8') ... f = result.table.item(i,c).text() myfile.write(f+";") 

它的工作,直到单元格包含一个特殊的字符。 我也试过

 myfile = open(filename, 'w') ... f = unicode(result.table.item(i,c).text(), "utf-8") 

但是当特殊字符出现时也会停止。 我不知道我在做什么错。

从你的shell运行:

 pip2 install unicodecsv 

并且(不像原来的问题)假定你正在使用Python内置的csv模块,转
import csv导入
在你的代码import unicodecsv as csv

Python 3.x( docs )非常简单。

 import csv with open('output_file_name', 'w', newline='', encoding='utf-8') as csv_file: writer = csv.writer(csv_file, delimiter=';') writer.writerow('my_utf8_string') 

对于Python 2.x,看这里 。

使用这个包,它只是工作: https : //github.com/jdunck/python-unicodecsv 。

Python文档中的示例演示如何编写Unicode CSV文件: http : //docs.python.org/2/library/csv.html#examples

(不能在这里复制代码,因为它受版权保护)

一个非常简单的黑客就是使用json导入而不是csv。 例如,而不是csv.writer只需执行以下操作:

  fd = codecs.open(tempfilename, 'wb', 'utf-8') for c in whatever : fd.write( json.dumps(c) [1:-1] ) # json dumps writes ["a",..] fd.write('\n') fd.close() 

基本上,给定正确的顺序列表的字段,JSON格式的string是相同的一个CSV行,除了[和]在开始和结束分别。 而且json似乎对python 2中的utf-8很健壮。*

对我来说,Python 2 CSV模块文档中的UnicodeWriter类并没有真正的工作,因为它打破了csv.writer.write_row()接口。

例如:

 csv_writer = csv.writer(csv_file) row = ['The meaning', 42] csv_writer.writerow(row) 

作品,同时:

 csv_writer = UnicodeWriter(csv_file) row = ['The meaning', 42] csv_writer.writerow(row) 

会抛出AttributeError: 'int' object has no attribute 'encode'

由于UnicodeWriter显然希望所有的列值都是string,我们可以自己转换这些值,只使用默认的CSV模块:

 def to_utf8(lst): return [unicode(elem).encode('utf-8') for elem in lst] ... csv_writer.writerow(to_utf8(row)) 

或者我们甚至可以用csv_writer来添加一个write_utf8_row函数 – 练习留给读者。