我有一个包含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
但是这段代码看起来太长了。我有什么方法可以使用任何循环来做到这一点,这样我就不必为每个文件编写单独的代码了吗?
答案 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实用程序执行此操作。无需重新发明轮子!