Как разделить файл? - PullRequest
0 голосов
/ 18 ноября 2018

Я попытался разделить файл на несколько файлов чанка, разделив общую строку текстового файла поровну.Тем не менее, он не делит размер поровну.Есть ли способ разделить файл на несколько равных частей без записи каких-либо неполных строк в файлы с помощью Python 3.xx?Например, текстовый файл размером 100 МБ будет разделен на 33 МБ, 33 МБ и 34 МБ.

Вот что я получил до сих пор:

chunk=3
my_file = 'file.txt'
NUM_OF_LINES=-(-(sum(1 for line in open(my_file)))//chunk)+1
print(NUM_OF_LINES)


sorting = True
hold_lines = []
with open(my_file,'r') as text_file:
    for row in text_file:
        hold_lines.append(row)
outer_count = 1
line_count = 0
while sorting:
    count = 0
    increment = (outer_count-1) * NUM_OF_LINES
    left = len(hold_lines) - increment
    file_name = "text.txt_" + str(outer_count * NUM_OF_LINES) + ".txt"
    hold_new_lines = []
    if left < NUM_OF_LINES:
        while count < left:
            hold_new_lines.append(hold_lines[line_count])
            count += 1
            line_count += 1
        sorting = False
    else:
        while count < NUM_OF_LINES:
            hold_new_lines.append(hold_lines[line_count])
            count += 1
            line_count += 1
    outer_count += 1
    with open(file_name,'w') as next_file:
        for row in hold_new_lines:
            next_file.write(row)

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Этот код пытается максимально точно выровнять размер подфайлов (не количество строк, два критерия не могут быть выполнены одновременно).Я использую некоторые простые инструменты для улучшения краткости и надежности.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) 
0 голосов
/ 18 ноября 2018

Если поддержание последовательного порядка строк не важно, https://stackoverflow.com/a/30583482/783836 - довольно простое решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...