【问题标题】:Python encoding/decoding error for 'cp866''cp866' 的 Python 编码/解码错误
【发布时间】:2018-06-13 08:45:08
【问题描述】:

6.5,我试图从 CSV 文件中提取一些信息,但该文件是用俄语编写的,所以我需要使用“cp866”来解码。但是,我无法得到正确的输出。

这是我使用的代码:

def printcsv():
    with open('vocabulary.csv',newline='') as f:
      reader = csv.reader(f)
      for row in reader:
          #store in array
          print(row.decode('cp866'))

这是我得到的错误:

"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/encodings/ascii.py", line 26, in decode
    return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xa7 in position 0: ordinal not in range(128)

【问题讨论】:

    标签: python-3.x decode encode cp866


    【解决方案1】:

    哎呀,这不是读取编码 csv 文件的正确方法。这是您尝试做的事情:

    with open('vocabulary.csv',newline='') as f: # open the file with default system encoding
      reader = csv.reader(f)                     # declare a reader on it
      for row in reader:                         # here comes the problem
    

    我假设您的系统使用 ASCII 作为默认编码。因此,当阅读器尝试加载一行时,会从文件中读取一行(字节)并解码为默认 ascii 编码的字符串。

    无论如何,row 是一个列表,而不是一个字符串,所以如果你到达那一行,row.decode 会引发错误。

    打开文件时指定文件编码的正确方法:

    def printcsv():
        with open('vocabulary.csv',newline='', encoding='cp866') as f:
          reader = csv.reader(f)
          for row in reader:
              #store in array
    

    但我不确定

              print(row)
    

    根据sys.stdout 使用的编码,您可能必须对数组中的每个字符串进行显式编码:

              print([ field.encode(encoding) for field in row ])
    

    【讨论】:

      猜你喜欢
      • 2018-07-25
      • 1970-01-01
      • 2015-01-28
      • 1970-01-01
      • 2023-03-26
      • 2012-01-28
      • 2014-06-26
      • 2015-02-03
      • 2019-09-01
      相关资源
      最近更新 更多