我需要在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命令行实用程序.
你可以使用大于一行的块,并执行二进制 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的澄清了条件。