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


83

我正在尝试从PyQt4创建csv格式的文本文件QTableWidget。我想用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")

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


“它还顶”?那是什么意思?你得到什么错误?您的输入是什么?

输入的是pyqt4 QTableWidgetItem。问题是我没有收到任何错误,因为脚本作为插件运行。
马丁

然后尝试重现QT以外的问题。

找到了解决方案。我不得不写myfile.write(u"%s"&f+";")
马丁

Answers:


106

从您的shell运行:

pip2 install unicodecsv

并且(与原始问题不同)假设您使用的是Python的内置csv模块,则将代码
import csv写入
import unicodecsv as csv


29
它没有工作只是通过更换进口,我也有过创建作家时添加的编码:writer = csv.writer(out, dialect='excel', encoding='utf-8'),并创建了文件处理程序open(...没有 codecs.open(...
Suzana

4
我尝试了所有关于StackOverflow的建议,只有这一点对我有用。
周星驰

90

对于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,请参见此处


1
如果要发送的内容writerow不是utf-8,该怎么办?能行吗?
CKM

1
完全不需要第三方pip安装。
Vaibhav Vishal


3

对我来说UnicodeWriter,Python 2 CSV模块文档中的类并没有真正起作用,因为它破坏了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显然希望所有列的值是字符串,我们可以将这些值自己和只使用默认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功能-该练习留给读者。


2

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

(由于受版权保护,因此无法在此处复制代码)


1
感谢您的链接。这很有帮助。就我所知,即使您发布了链接,也无法复制将代码粘贴到此处?(+1 ownering版权)
突变

1
@Mutant:代码不像科学论文。代码受版权保护。尽管我99.999%的人确定Python所有者不会起诉SO复制其代码,但我不想阅读他们冗长的许可证以查明是否允许这样做。另外,最好
不时

1
感谢您的提醒。不幸的是,我们生活的世界变得如此(无理)快速和粗心,那里信息的流动速度超出了人们的想象,它确实需要一遍又一遍地提醒重要的限制。谢谢你:)
突变2015年

2
docs链接是半有用的(示例更好),但是这里的“ copyright”参数过分夸张了。Python是显式开源(v2 v3)。许可证很明确:“免版税,全球范围内的许可证,可以公开复制,分析,测试,表演和/或展示,准备衍生作品,分发……等”。页面顶部,“兼容GPL”应该会让您感到舒适。共享开源的东西。如果需要,甚至可以对其进行修改。它是开源的,这是有原因的。
alttag

@alttag在项目中复制或使用GPLd代码意味着同一项目中的所有其他代码现在也都在GPL下。由于我不是版权律师,因此对于在网站上发布的代码,我不知道这意味着什么。
亚伦·迪古拉

0

对于python2,您可以在代码之前使用此代码,csv_writer.writerows(rows)
该代码不会将整数转换为utf-8字符串

def encode_rows_to_utf8(行):
    encode_rows = []
    对于逐行:
        encode_row = []
        对于行中的值:
            如果isinstance(value,basestring):
                值= unicode(值).encode(“ utf-8”)
            encode_row.append(value)
        encode_rows.append(encoded_row)
    返回encode_rows

-1

一个非常简单的技巧是使用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格式的字符串与csv行相同,除了分别在开头和结尾处使用[和]。而且json在python 2. *中对utf-8似乎很健壮。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.