【问题标题】:Python: How can I read a file in x encoding and save it as utf-8Python:如何读取 x 编码的文件并将其保存为 utf-8
【发布时间】: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 编码的第一个版本。
  • 我不愿意将其添加为答案,因为虽然它解决了您的问题,但它并不是您所提问题的实际答案。

标签: python pandas utf-8


【解决方案1】:

在 Python 中将文件从一种编码转换为另一种编码:

with open('file1.txt',encoding='utf16') as fin:
   with open('file2.txt','w',encoding='utf8') as fout:
       fout.write(fin.read())

但在您的情况下,正如 Mark Ransom 在评论中指出的那样,只需使用适当的编码打开:

bmc = pd.read_csv('file.csv', sep='|', error_bad_lines=False, encoding='utf16')

【讨论】:

  • 当然我尝试过这样做,但是当我这样做时,每隔一个字符生成一个包含 NUL 字符的文件
  • @luisfer 这就是 UTF-16,一种基于单词的编码。如果您想正确读取它,您必须使用可以读取 UTF-16 编码的编辑器。记事本++可以做到这一点。如果您使用utf16 编码,Pandas 可以读取文件。如果您不想要 UTF-16 编码,请使用我的答案的第一部分进行转换。
  • 哦,明白了。我没有使用 utf-16 编码,所以我什么也没得到!现在很清楚了
猜你喜欢
  • 1970-01-01
  • 2013-11-04
  • 1970-01-01
  • 1970-01-01
  • 2016-11-08
  • 1970-01-01
  • 1970-01-01
  • 2013-04-23
  • 1970-01-01
相关资源
最近更新 更多