Этот код пытается максимально точно выровнять размер подфайлов (не количество строк, два критерия не могут быть выполнены одновременно).Я использую некоторые простые инструменты для улучшения краткости и надежности.np.searchsorted
найти номера строк, в которых деление выполняется в исходном файле.
import numpy as np,math
lines=[]
lengths=[]
n=6
with open('file.txt') as f:
for line in f:
lines.append(line)
lengths.append(len(line))
cumlengths = np.cumsum(lengths)
totalsize = cumlengths[-1]
chunksize = math.ceil(totalsize/n) # round to the next
starts = np.searchsorted(cumlengths,range(0,(n+1)*chunksize,chunksize)) # places to split
for k in range(n):
with open('out' + str(k+1) + '.txt','w') as f:
s=slice(starts[k],starts[k+1])
f.writelines(lines[s])
print(np.sum(lengths[s])) # check the size
без внешних модулей, starts
также может быть построен:
chuncksize = (sum(lengths)-1)//n+1
starts=[]
split=0
cumlength=0
for k,length in enumerate(lengths):
cumlength += length
if cumlength>=split:
starts.append(k)
split += chunksize
starts.append(k+1)