【问题标题】:Python 3: CSV files and Unicode ErrorPython 3:CSV 文件和 Unicode 错误
【发布时间】:2017-06-03 04:17:59
【问题描述】:

我有一个带有此标头的 csv (tsv) 文件

"Message Name"  "Field" "Base Label"    "Base Label Update Date"    "Translated Label"  "Translated Label Update Date"  "Language"
"Message"   "subject_template"  "New Task: Assess Distribution Outcomes for ""${docNameNoLink}"", ""${docNumber}""" "8/10/16 4:17:43 PM"    "Nouvelle tâche : évaluez le résultat de la distribution de « ${docNameNoLink} »."  "2/17/14 5:09:10 AM"    "fr"

当我尝试使用此代码读取文件时

import csv
with open(fileName, 'r',  encoding='utf-8', errors='replace') as fdata:
    csv.register_dialect('tsv', delimiter='\t', quoting=csv.QUOTE_NONE)
    reader=csv.reader(fdata, dialect='tsv')
    try:
        for row in reader:
            print (row)
    except csv.Error as e:
        sys.exit('file{}, line {}: {}'.format(fileName, reader.line_num, e))

我收到消息错误: 文件名文件,第 1 行:行包含 NULL 字节

但是,如果我在没有errors='replace|ignore'部分的情况下运行此代码,则相同的代码:

with open(fileName, 'r',  encoding='utf-8') as fdata:
    csv.register_dialect('tsv', delimiter='\t', quoting=csv.QUOTE_NONE)
    reader=csv.reader(fdata, dialect='tsv')
    try:
        for row in reader:
            print (row)
    except csv.Error as e:
        sys.exit('file {}, line {}: {}'.format(fileName, reader.line_num, e))

我收到以下消息错误:

File "csvFiles.py", line 76 in <module>
  for row in reader:
   File "c:\Python35\lib\codecs.py", line 321 in decode (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

这个错误的可能原因是什么?我怎样才能纠正它并使脚本工作?

【问题讨论】:

    标签: python-3.x csv unicode


    【解决方案1】:

    您的数据不是用“utf-8”编码的,而是用“utf-16-le”或类似的东西编码的。 'utf-16-le' 只是一个猜测。当我使用 'utf-16-le' 对您的数据进行编码时,会产生完全相同的错误。检查数据文件的编码。在 Linux 中,您可以使用诸如 emacs 之类的编辑器或“文件”实用程序。

    错误信息本身告诉我们文件的第一个字节是 0xff。这可能是Byte-Order Mark 的一部分。

    【讨论】:

      【解决方案2】:

      如果你只是在代码行中做一个改变,它可能会起作用

      with open(fileName, 'r',  encoding='utf-16') as fdata:
      

      【讨论】:

        【解决方案3】:

        出于某种原因,python 不喜欢单个反斜杠。再试一次,但用两个替换所有单个反斜杠。祝你好运。

        【讨论】:

        • 出于某种原因?它实际上是一个定义良好的转义字符实现。
        猜你喜欢
        • 2021-09-18
        • 1970-01-01
        • 2020-10-14
        • 2015-09-01
        • 2013-07-25
        • 1970-01-01
        • 2021-08-11
        • 1970-01-01
        • 2017-04-27
        相关资源
        最近更新 更多