Python 我有一个文件>;1g,我想把它分成每个100k行的文件

Python 我有一个文件>;1g,我想把它分成每个100k行的文件,python,Python,我想用python来做这件事,但我被难住了。我无法将整个文件加载到ram中,而不会出现不稳定的情况,所以我想逐行读取它。。。任何建议都将不胜感激。一个想法可以是: import itertools with open('the1gfile.txt') as inf: for i in itertools.count(): with open('outfile%d.txt' % i, 'w') as ouf: for linenum, line in enumerate(

我想用python来做这件事,但我被难住了。我无法将整个文件加载到ram中,而不会出现不稳定的情况,所以我想逐行读取它。。。任何建议都将不胜感激。

一个想法可以是:

import itertools

with open('the1gfile.txt') as inf:
  for i in itertools.count():
    with open('outfile%d.txt' % i, 'w') as ouf:
      for linenum, line in enumerate(inf):
        ouf.write(line)
        if linenum == 99999: break
      else:
        break
with
语句需要Python 2.6或更高版本,或者2.5需要模块顶部带有
from\uuuu future\uuuu导入with\u语句
(这就是我使用老式字符串格式来生成输出文件名的原因——新样式在2.5中不起作用,并且您不告诉我们要使用哪种Python版本——当然,如果您的Python版本支持,请替换新样式格式;-)

itertools.count()

对于linenum,枚举(inf)中的行:
一次读取一行(带有一定的速度缓冲),并将linenum设置为0、1、2……等等-我们在100000行之后中断该循环(下次,for循环将继续精确读取此行停止的位置)

for
循环的
else:
子句在且仅当该循环中的
break
没有执行时执行,因此,如果我们读取的行数小于100000行,即输入文件完成时。请注意,如果输入文件中的行数是100000的精确倍数,则将有一个空输出文件


我希望这能让您充分了解该机制的每一部分…?

如果您确实需要拆分文件,为什么不直接使用*nix
split
实用程序呢


你试过什么?“逐行阅读”似乎是正确的答案。是的,但我在某个地方读到readline()实际上将整个文件加载到ram中。我不完全确定
readline()
但我知道一个事实,文件中的
行:…
构造没有将整个文件读入RAM。我只是检查了源代码(用于Python 2.6.5)而且,
readline
一次只能读取一行。无论是
readline
还是循环都不会一次性将整个文件读取到内存中——只执行适度的缓冲(为了速度),但我们说的是最多几KB。因为一次将1G文件读入内存不会使*nix-box“不稳定”。+1用于突出显示玩具操作系统和真实操作系统之间的差异。
split
不会立即将整个文件读入内存-它是基于流的。@Amber我暗示操作系统正在使用win如果OP使用的是*nix,那么如果您使用的是Windows,那么就不会提到“不稳定”,您最好还是使用split:Right工具来完成这项工作……但它不是Python(尽管在Python中可以调用),而且不可移植。
split -l 100000 inputfile