Разделить текстовый файл на 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.
Другие вопросы по тегам