UnicodeError:UTF-16流不以BOM

时间:2018-03-19 20:33:42

标签: python csv error-handling

我无法通过python读取csv文件。 我的csv文件有韩文和数字。

下面是我的python代码。

import csv
import codecs
csvreader = csv.reader(codecs.open('1.csv', 'rU', 'utf-16'))
for row in csvreader:
    print(row)

首先,当我在上面的代码中输入“for csvreader”行时,出现了UnicodeDecodeError。

所以我使用下面的代码然后问题似乎得到了解决

csvreader = csv.reader(codecs.open('1.csv', 'rU', 'utf-16'))

然后我遇到了NULL字节错误。然后我无法弄清楚csv文件有什么问题。

[更新]我认为我没有改变以前代码中的任何内容,但我的程序显示“UnicodeError:UTF-16流不以BOM开头”

当我用excel打开csv时,我可以看到正确格式的表格(图片附在底部)  但是当我在崇高的文本中打开它时,下面是我得到的片段。

504b 0304 1400 0600 0800 0000 2100 6322
f979 7701 0000 d405 0000 1300 0802 5b43
6f6e 7465 6e74 5f54 7970 6573 5d2e 786d
6c20 a204 0228 a000 0200 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000

如果您需要有关我的文件的更多信息,请告诉我们!

感谢您的帮助。 在此先感谢:)

csv file shown in excel

csv file shown in sublime text

4 个答案:

答案 0 :(得分:3)

问题是你的输入文件显然不是以BOM开头的(一个特殊字符,对于little-endian和big-endian utf-16,可识别的编码方式不同),所以你不能只使用“utf” -16“作为编码,您必须明确使用”utf-16-le“或”utf-16-be“。

如果你不这样做,codecs会猜测,如果猜错了,它会尝试向后读取每个代码点并获得非法值。

如果您发布的样本以偶数偏移量开始并且包含一堆ASCII,那么它的结尾很少,所以请使用-le版本。 (但当然最好先看看它实际上是什么而不是猜测。)

答案 1 :(得分:1)

现在您已在问题中包含了更多文件,而这根本不是CSV文件。我的猜测是它是一个旧式的二进制XLS文件,但这只是猜测。如果您只是将spam.xls重命名为spam.csv,则不能这样做;您需要将其导出为CSV格式。 (如果您需要帮助,请在另一个提供Excel帮助而不是编程帮助的网站上询问。)

如果由于某种原因你不能这样做,PyPI上的库就可以解析XLS文件 - 但是如果你想要CSV,你可以导出CSV,这是一个更好的主意。

答案 2 :(得分:1)

文件以PKZIP signature开头,因此它实际上是一个XLSX文件。

这很棒,因为您不必使用CSV文件,而是必须知道字符编码,标题,列类型,分隔符,文本引用和转义规则以及行结尾,您只需打开它,程序就可以看到数据结构。

答案 3 :(得分:0)

在为这个问题苦苦挣扎数小时后,我了解到 Excel 可以以多种 CSV 格式导出数据。

在 Excel 中,请确保在导出时使用“CSV UTF-8(逗号分隔)”选项。 (与其他 CSV 选项相比,您通常可能希望使用此类型)。

一旦您确定 UTF 类型,在本例中为“UTF-8”,请返回您的 Python 脚本并将编码更改为“UTF-8”,尽管我发现跳过此参数也有效。

with open('schools_dataset.csv', encoding='utf-8') as csv_file:
# continue opening the file
相关问题