Python:如何读取x编码的文件并将其另存为utf-8

时间:2019-01-02 21:52:33

标签: python pandas utf-8

我在“ .csv”文件上有一个巨大的数据集(约850万个记录)(它使用管道而不是逗号),我不知道它的编码是什么,因为我住在墨西哥,并且有重音(áé ...)我假设它是拉丁语或iso-8859-1。

当我尝试使用熊猫将文件导入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或拉丁文,则会收到错误消息:

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,现在我可以用熊猫打开此文件了,没有问题。

所以我认为转换为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字符,让我在编辑器中显示它:

enter image description here

当然,此文件在Pandas中不起作用。到目前为止,我已经使用Notepad ++解决了我的问题,但是当然必须有一种更好的方法,一种不必依赖其他工具的方法。

1 个答案:

答案 0 :(得分:2)

要在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')