UnicodeDecodeError: 'ascii'编解码器无法解码0xc3位置上的字节,因为该值不在128范围内。

4

我刚刚离开工作电脑(使用Python 2.7),我有一个脚本正在完成中(如下所示)。它在工作时运行得很好,我只想再添加一两个东西。但是我回到家,在我的Mac上使用Python的版本(3.2.2),我遇到了以下错误:

Traceback (most recent call last):
  File "/Users/Downloads/sda/alias.py", line 25, in <module>
    for row_2 in in_csv:
  File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/encodings/ascii.py", line 26, in decode
    return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 304: ordinal not in range(128)

我的代码在这里:

import csv
inname = "Fund_Aliases.csv"
outname = "output.csv"

def first_word(value):
    return value.split(" ", 1)[0]

with open(inname, "r") as infile:
    with open(outname, "w") as out file:
      in_csv = csv.reader(infile)
      out_csv = csv.writer(outfile)

     column_names = next(in_csv)
     out_csv.writerow(column_names)

      id_index = column_names.index("id")
      name_index = column_names.index("name")

      try:
          row_1 = next(in_csv)
          written_row = False

          for row_2 in in_csv:
            if first_word(row_1[name_index]) == first_word(row_2[name_index]) and row_1[id_index] != row_2[id_index]:
                if not written_row:
                    out_csv.writerow(row_1)

                out_csv.writerow(row_2)
                written_row = True
            else:
                written_row = False

            row_1 = row_2
      except StopIteration:
        # No data rows!
        pass
1个回答

5

看起来 Fund_Aliases.csv 不是一个 ASCII 文件。

根据 Python3 文档

由于 open() 用于打开 CSV 文件进行读取,因此该文件默认将使用系统默认编码(请参阅 locale.getpreferredencoding())将其解码为 Unicode。要使用不同的编码解码文件,请使用 open 的 encoding 参数:

with open('some.csv', newline='', encoding='utf-8') as f:
    reader = csv.reader(f)

因此,请尝试指定 encoding 参数。


谢谢!这就解决了问题,我只需要相应地更新以下两行代码:with open(inname, "r", encoding="utf-8") as infile: with open(outname, "w", encoding="utf-8") as outfile: - user1590499
仅澄清一下,PC上的CSV文件与通过电子邮件下载到Mac上的CSV文件不是相同的ASCI格式。这是否基本意味着苹果操作系统中的1-2行代码使该文件与Windows操作系统中的文件不同? - user1590499
当然,这可能会因为那1-2行代码的内容而有很大的不同。但通常情况下,如果有差异,它通常仅限于EOL字符(Unix的'\n'与Windows的'\r\n'之间的差异)或编码差异。明确指定编码应该有助于避免这个问题。 - unutbu
1
我羞怯地承认我对Unicode还很陌生。顺便说一下,我发现这些链接很有帮助:http://docs.python.org/py3k/howto/unicode.html,http://www.joelonsoftware.com/articles/Unicode.html - Matthew Cornell

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