【发布时间】:2019-05-29 12:46:53
【问题描述】:
我在“.csv”文件(它使用管道而不是逗号)上有一个巨大的数据集(大约 850 万条记录),我不知道它的编码是什么,因为我住在墨西哥并且有口音(á é ...)我假设它是拉丁语或 iso-8859-1。
当我尝试使用 pandas 将文件导入 DataFrame 时
bmc=pd.read_csv('file.csv', sep='|',
error_bad_lines=False, encoding='iso-8859-1')
它什么也没读:
ÿþF Unnamed: 1 Unnamed: 2 Unnamed: 3 Unnamed: 4
0 NaN NaN NaN NaN NaN
1 NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN NaN
如果我没有放置 iso-8859-1 或 latin,我得到了错误:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
因此,要将文件编码为 utf-8,我在可以读取大文件的 Notepad++ 中打开文件,我手动删除文件开头的 ÿþ,然后将编码更改为 utf-8 并另存为新文件。
Notepad++ 说文件编码是:UCS-2 LE BOM
文件大小从 1.8Mb 到大约 0.9Mb,现在我可以用 pandas 打开这个文件了。
所以我认为转换为 utf-8 应该是我预处理的一部分。
我使用了这个解决方案:How to convert a file to utf-8 in Python? 并创建了一个函数来转换多个文件:
BLOCKSIZE = 1048576 # or some other, desired size in bytes
def convert_utf8(sourceFileName, targetFileName, sourceEncoding='iso-8859-1'):
with codecs.open(sourceFileName, "r", sourceEncoding) as sourceFile:
with codecs.open(targetFileName, "w", "utf-8") as targetFile:
while True:
contents = sourceFile.read(BLOCKSIZE)
if not contents:
break
targetFile.write(contents)
现在的问题是,当文件被写入时,它会在每个有效字符后添加一个 NULL 字符,让我在编辑器中显示它:
当然,这个文件在 Pandas 中不起作用。到目前为止,我已经使用 Notepad++ 解决了我的问题,但是当然必须有更好的方法,一种我不必依赖其他工具的方法。
【问题讨论】:
-
为什么要转换文件?只需使用正确的编码打开它:
bmc=pd.read_csv('file.csv', sep='|', error_bad_lines=False, encoding='utf-16')。 UTF-16 是已过时的 UCS-2 的超集。 -
为什么这样有效??????它有效,而且速度非常快,但我不知道什么是 utf-16。我真的很讨厌所有这些编码的东西。非常感谢!
-
P.S.遗憾的是,Windows 是 Unicode 的早期采用者。如果他们等待,他们本可以像 Linux 一样在 UTF-8 上进行标准化。 UCS-2 是 Unicode 编码的第一个版本。
-
我不愿意将其添加为答案,因为虽然它解决了您的问题,但它并不是您所提问题的实际答案。