99

我正在尝试从 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")

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

4

7 回答 7

119

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,请看这里

于 2016-05-21T14:50:42.600 回答
106

从你的 shell 运行:

pip2 install unicodecsv

并且(与原始问题不同)假设您使用的是 Python 的内置csv模块,请在您的代码中转换
import csv
import unicodecsv as csv

于 2015-07-26T21:19:04.407 回答
14

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

于 2014-03-24T11:07:52.570 回答
6

对我来说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函数——这个练习留给读者。

于 2017-09-27T15:11:30.743 回答
2

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

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

于 2013-09-12T16:47:28.323 回答
0

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

def encode_rows_to_utf8(行):
    编码行 = []
    对于行中的行:
        编码行 = []
        对于行中的值:
            如果是实例(值,基本字符串):
                value = unicode(value).encode("utf-8")
            编码行附加(值)
        编码行附加(编码行)
    返回编码行
于 2019-01-29T11:11:34.367 回答
-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 很健壮。 *

于 2017-01-15T13:38:04.967 回答