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

时间:2013-09-12 14:25:28

标签: python csv encoding utf-8

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

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

7 个答案:

答案 0 :(得分:95)

从你的shell运行:

pip2 install unicodecsv

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

答案 1 :(得分:59)

对于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,请查看here

答案 2 :(得分:14)

使用此软件包,它只是有效:https://github.com/jdunck/python-unicodecsv

答案 3 :(得分:3)

对我来说,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显然希望所有列值都是字符串,我们可以自己转换这些值,只使用默认的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功能 - 练习留给读者。

答案 4 :(得分:2)

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

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

答案 5 :(得分:0)

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

def encode_rows_to_utf8(rows):
    encoded_rows = []
    for row in rows:
        encoded_row = []
        for value in row:
            if isinstance(value, basestring):
                value = unicode(value).encode("utf-8")
            encoded_row.append(value)
        encoded_rows.append(encoded_row)
    return encoded_rows

答案 6 :(得分:-1)

一个非常简单的hack是使用json import而不是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很健壮。*