Python错误;UnicodeEncodeError: 'ascii'编解码器无法编码字符u'\u2026'

4
我正在尝试从一个包含推文的JSON文件中提取一些数据并将其写入CSV。该文件包含各种字符,我猜这就是为什么我得到这个错误消息的原因:UnicodeEncodeError: 'ascii' codec can't encode character u'\u2026'。我猜我必须在写入CSV文件之前将输出转换为UTF-8,但我一直没有成功。我在stackoverflow上找到了类似的问题,但我无法将解决方案适应我的问题(我应该补充说明,我不太熟悉Python。我是一名社会科学家,而不是程序员)。
import csv
import json

fieldnames = ['id', 'text']

with open('MY_SOURCE_FILE', 'r') as f, open('MY_OUTPUT', 'a') as out:

    writer = csv.DictWriter(
                    out, fieldnames=fieldnames, delimiter=',', quoting=csv.QUOTE_ALL)

    for line in f:
        tweet = json.loads(line)
        user = tweet['user']
        output = {
            'text': tweet['text'],
            'id': tweet['id'],
        }
        writer.writerow(output)

感谢您的帮助。如果我使用codecs.open('MY_OUTPUT','a',encoding ='utf-8'),我仍然会收到相同的错误消息。 请随意浏览我的源文件。它大约有58 MB:https://www.dropbox.com/s/rku27up2ge235nh/dad90769c3dbf537f995ace595ac71ca?dl=0 - 5mark
如果您正在使用Python 2.7,文档中指出:“注意:此版本的csv模块不支持Unicode输入。”。 - martineau
1
csv文档中的示例部分指出:“csv模块不直接支持读写Unicode,但它是8位干净的,除了一些ASCII NUL字符的问题。因此,只要避免使用像UTF-16这样使用NUL的编码,就可以编写处理编码和解码的函数或类。推荐使用UTF-8。”请注意,这只是你问题的一部分。另一个问题是尝试逐行读取JSON文件。 - martineau
1
@martineau,该文件有不同的json对象行。所需的只是进行编码。 - Padraic Cunningham
1
@Padraic:你怎么知道每个都是不同的JSON对象? - martineau
显示剩余6条评论
1个回答

6

您只需要将文本编码为utf-8:

for line in f:
    tweet = json.loads(line)
    user = tweet['user']
    output = {
        'text': tweet['text'].encode("utf-8"),
        'id': tweet['id'],
    }
    writer.writerow(output)

在Python2中,csv模块不支持写入Unicode:

注意:此版本的csv模块不支持Unicode输入。同时,目前存在一些关于ASCII NUL字符的问题。因此,为了安全起见,所有输入应该是UTF-8编码或可打印的ASCII编码;请参考“示例”章节中的示例。


这个最终对我有效了!感谢所有为此做出贡献的人。 - 5mark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接