首页 > 解决方案 > DictWriter 抛出 UnicodeEncodeError

问题描述

我的 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>

我该如何解决?谢谢!

标签: pythonunicode

解决方案


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

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


推荐阅读