在小文件中剪切大文本文件

时间:2014-08-02 20:08:06

标签: python python-2.7

我有一个包含1000000行的文本文件。我想将其拆分为每个包含15000行的文件。例如,第一个文件包含1到15000行,下一个文件包含15001到30000行,依此类推。这就是我所做的:

lines = open('myfile.txt').readlines()
open('1_15000.txt', 'w').writelines(lines[0:15000])
open('15001_30000.txt', 'w').writelines(lines[15000:30000])
open('30000_45000.txt', 'w').writelines(lines[30000:45000])
open('45000_60000.txt', 'w').writelines(lines[45000:60000])
...
...
... so on till 1000000

但是这段代码看起来太长了。我有什么方法可以使用任何循环来做到这一点,这样我就不必为每个文件编写单独的代码了吗?

4 个答案:

答案 0 :(得分:1)

lines = open('myfile.txt').readlines()
for i in range(0, 1000000, 15000):
   open('{0}_{1}.txt'.format(i+1, i+15000), 'w').writelines(lines[i:i+15000])

希望这有帮助。

答案 1 :(得分:0)

lines = open('myfile.txt').readlines()

将整个文件加载到Python列表中。当文件很大时,你不会想要这样做,因为它可能会导致你的机器内存不足。


这会将文件拆分为N行的块。每个块都是一个列表。当块是空列表时它会停止。

import itertools as IT
N = 15000

with open('data', 'rb') as f:
    for i, chunk in enumerate(iter(lambda: list(IT.islice(f, N)), [])):
        outfile = '{:06d}_{:06d}.txt'.format(i*N, (i+1)*N)
        with open(outfile, 'wb') as g:
            g.writelines(chunk)

如果文件包含N个空行,则上述方法可能会过早结束。或者如果N非常大,将N行读入Python列表可能会导致MemoryError。您可以通过一次处理一行(通过调用next(f))并捕获指示文件末尾的StopIteration异常来避免这些问题:

import itertools as IT
N = 15000

with open('data', 'rb') as f:
    try:
        for i in IT.count():
            outfile = '{:06d}_{:06d}.txt'.format(i*N, (i+1)*N)
            with open(outfile, 'wb') as g:
                for j in range(N):
                    line = next(f)
                    g.write(line)
    except StopIteration:
        pass

答案 2 :(得分:0)

您可以尝试以下方式:

lines = open('myfile.txt').readlines()
count = 0
incr = 15000
while count<len(lines):
    open(str(count)+'_'+str(count+incr)+'.txt', 'w').writelines(lines[count:incr])
    count += incr

答案 3 :(得分:0)

请注意,您也可以使用linux split实用程序执行此操作。无需重新发明轮子!