在python中将文件从latin1转换为utf-8的最快方法

Mik*_*rov 5 python

我需要在python中将文件从latin1转换为utf-8的最快方法.文件很大~2G.(我正在移动数据库数据).到目前为止我有

import codecs
infile = codecs.open(tmpfile, 'r', encoding='latin1')
outfile = codecs.open(tmpfile1, 'w', encoding='utf-8')
for line in infile:
     outfile.write(line)
infile.close()
outfile.close()
Run Code Online (Sandbox Code Playgroud)

但它仍然很慢.转换占整个迁移时间的四分之一.

如果它比本机python代码更快,我也可以使用linux命令行实用程序.

小智 6

我会选择iconv和系统调用.


Ale*_*lli 4

你可以使用大于一行的块,并执行二进制 I/O —— 每个都可能会加快一点速度(尽管在 Linux 上二进制 I/O 不会,因为它与文本 I/O 相同):

 BLOCKSIZE = 1024*1024
 with open(tmpfile, 'rb') as inf:
   with open(tmpfile, 'wb') as ouf:
     while True:
       data = inf.read(BLOCKSIZE)
       if not data: break
       converted = data.decode('latin1').encode('utf-8')
       ouf.write(converted)
Run Code Online (Sandbox Code Playgroud)

逐行读取、行结束转换(不在 Linux 上;-)和 codecs.open 风格的编码解码中隐含的逐字节解析应该是减慢速度的部分原因。这种方法也是可移植的(就像您的方法一样),因为控制字符无论如何都不\n需要在这些编解码器之间进行转换(在任何操作系统中)。

这仅适用于没有多字节字符的输入编解码器,但“latin1”就是其中之一(输出编解码器是否具有此类字符并不重要)。

根据您的磁盘、文件系统和可用 RAM,尝试不同的块大小以找到最佳性能点。

编辑:根据@John的评论更改了代码,并根据@gnibbler的澄清了条件。

  • 仅在这种情况下这才是安全的,因为“latin1”没有多字节字符。 (4认同)