如何拆分大小大于可用内存的文件?

amp*_*ent 5 python io

假设我只有 8G 的可用堆空间,我想将一个比它大的文件分割成一系列较小的文件。如果我尝试

with open(fname) as f:
    content = f.readlines()
Run Code Online (Sandbox Code Playgroud)

我会耗尽内存,因为它会尝试加载整个文件。有没有办法打开文件而不将整个文件加载到内存中,只需从 X 到 Y 行?

tde*_*ney 2

itertools.islice是完成这项工作的好工具,但您需要考虑如何有效地使用它。例如,islice(f, 10, 20)丢弃 10 行然后发出 20 行,因此这不是进行写入的好方法。根据您编写循环的方式,您可以删除数据或为每次写入重新扫描文件。

也不明显知道您何时完成。fileobj.writelines(isslice(f, 10))会很高兴地写入 0 行文件,直到时间结束。您实际上只知道您已经完成了,因此您可以测试是否编写了一个零长度文件来终止。

在这个例子中,我的大文件有 100 行长,我分成 10 行 apeice.... 测试起来比 8gig 文件要快一些。

import itertools
import os

lines_per_file = 10

with open('big.txt') as infp:
    # file counter used to create unique output files
    for file_count in itertools.count(1):
        out_filename = 'out-{}.txt'.format(file_count)
        with open(out_filename, 'w') as outfp:
            # write configured number of lines to file
            outfp.writelines(itertools.islice(infp, lines_per_file))
        # break when no extra data written
        if os.stat(out_filename).st_size == 0:
            os.remove(out_filename)
            break
Run Code Online (Sandbox Code Playgroud)