DictWriter引发UnicodeEncodeError

时间:2018-07-18 18:35:31

标签: python unicode

我的CSV文件如下:

"Domain", "A"
rolexkings.ml,1
netmajic.com,1
northumbrianresort.info,2
дольщикиспб.рф,1

要进行更新,我正在执行以下操作(有效的代码段,但为了简洁而不是实际的逻辑)

filename = 'file.csv'
tempfile = NamedTemporaryFile(mode='w', delete=False)
fields = ["Domain", "A"]

with open(filename, 'r', encoding='utf-8') as csvfile, tempfile:

    reader = csv.DictReader(csvfile, fieldnames=fields)
    writer = csv.DictWriter(tempfile, fieldnames=fields)

    next(reader, None)  # skip the headers

    for row in tqdm(reader):
        print(row['Domain'])
        row = {'Domain': row['Domain'], 'A': row['A']}
        writer.writerow(row)

shutil.move(tempfile.name, filename)

一旦遇到非拉丁域,我就会被抛出:

UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-10: character maps to <undefined>

我该如何解决?谢谢!

1 个答案:

答案 0 :(得分:1)

您需要为tempfile指定编码。默认情况下,它似乎以ASCII模式(charmap编解码器)打开,无法处理西里尔字母字符串。您可能要使用utf-8,因为这是读取输入文件的编码。

您可能还应该将newline=""添加到两个文件打开调用中,正如csv模块所期望的那样,该模块本身处理“通用”换行符,而不是依赖于Python的常规支持。这可能与当前操作系统上的当前数据集无关紧要,但是如果您希望代码具有通用性,那是个好主意。