Разделить текстовый файл на N строк каждая?
Я хотел бы разбить очень большой файл.txt на равные части файлов, каждая часть, содержащая N строк. и сохранить его в папку
with open('eg.txt', 'r') as T:
while True:
next_n_lines = islice(T, 300)
f = open("split" + str(x.pop()) + ".txt", "w")
f.write(str(next_n_lines))
f.close()
Но это создает файлы с данными
" < itertools.islice object at 0x7f8fa94a4940 >"
в txt
файлы.
Я хотел бы сохранить ту же структуру и стиль, сохраненный в оригинале txt
файл.
И этот код не завершается автоматически, когда он достигает конца файла. Если возможно, я бы сделал так, чтобы код прекратил запись в файлы и вышел, если для записи не осталось данных.
2 ответа
Ты можешь использовать iter
с islice
, взяв n строк за раз, используя перечисление, чтобы дать вашим файлам уникальные имена. f.writelines
запишет каждый список строк в новый файл:
with open('eg.txt') as T:
for i, sli in enumerate(iter(lambda:list(islice(T, 300)), []), 1):
with open("split_{}.txt".format(i), "w") as f:
f.writelines(sli)
Ваш код зацикливается навсегда, так как вы не включаете условие прерывания, используя iter
с пустым списком будет означать, что цикл заканчивается, когда итератор исчерпан.
Также, если вы хотите передать объект islice для записи, вы просто позвоните writelines
на это то есть f.writelines(next_n_lines)
, str(next_n_lines)
,
Проблема в том itertools.islice
возвращает итератор, и вы пишете это str
в вашем файле, который является представлением функций в Python (показывая идентичность объекта):
< itertools.islice object at 0x7f8fa94a4940 >
В качестве более подходящего способа разрезания итератора на равные части вы можете использовать следующие grouper
функция, которая была предложена Python Wiki как itertools recipes
:
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return zip_longest(*args, fillvalue=fillvalue)
Вы можете передать свой файловый объект в качестве итератора для работы, а затем перебрать результат и записать их в свой файл:
with open('eg.txt', 'r') as T:
for partition in grouper(T,300):
# do anything with `partition` like join the lines
# or any modification you like. Then write it in output.