如何在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
函数 – 练习留给读者。