Удалить строки из начала и конца файла и записать оставшиеся строки в новый файл - PullRequest
0 голосов
/ 30 апреля 2018

Я пытаюсь создать функцию для копирования строк из одного файла, удаления первых omit_from_start и последних omit_from_end строк из файла и записи оставшихся строк в новый файл.

Вот что я пробовал:

def truncate_file(file1, file2):
#    file1 = "omit_lines_test.txt"    # Just for testing
#    file2 = "truncated_file.txt"    # Just for testing
    infile = open(file1, "r")
    outfile = open(file2, "w")

    print("\n*** Truncating file copy ***\n")
    omit_from_start = int(input("Omit how many lines from the start: "))
    omit_from_end = int(input("Omit how many lines from the end: "))

    lines_to_output = []

    lines = [line for line in infile]
    lines_to_output.append(str(lines[omit_from_start:omit_from_end]))

    for line in lines_to_output:
        for character in line:
            outfile.write(character)

    infile.close()
    outfile.close()

my infile - это просто текстовый файл, содержащий ['1\n', '2\n', '3\n', '4\n', '5\n', '6\n', '7\n', '8\n', '9\n', '10\n'], и мне нужно, чтобы outfile содержал, например, ['4\n', '5\n', '6\n', '7\n', '8\n'] для omit_from_start = 3 и omit_from_end = 2.

На данный момент lines_to_output содержит только ['[]']. Я также пытался использовать методы .join () и .pop (), но они также не выдают то, что мне нужно.

1 Ответ

0 голосов
/ 30 апреля 2018

Этот подход делает дополнительное сканирование файла, чтобы найти число строк, но он имеет преимущество, заключающееся в том, что во время копирования весь файл не хранится в памяти. Так что он может быть медленнее, чем оригинальный подход для небольших файлов, но позволит подходу работать с очень большими файлами.

def file_len(fname):
    with open(fname) as f:
        for i, l in enumerate(f):
            pass
    return i + 1

def truncate_file(file1, file2):
    infile = open(file1, "r")
    outfile = open(file2, "w")

    print("\n*** Truncating file copy ***\n")
    omit_from_start = int(input("Omit how many lines from the start: "))
    omit_from_end = int(input("Omit how many lines from the end: "))

    length = file_length(file1)

    # This iteration prevents whole file being stored in memory
    for i, line in enumerate(infile):
        if i < omit_from_start:
            continue;
        elif i < length - omit_from_end:
            outfile.write(line)
        elif
           break

    infile.close()
    outfile.close()

На самом деле код не запускался, поэтому могут быть некоторые граничные ошибки, но подход состоит в том, чтобы сканировать файл на предмет длины файла, затем повторять итерацию по встроенному файлу, пропуская начальные строки, а затем прерывать итерацию, когда достижение длины - строка omit_from_end.

Не выполнялась проверка входных данных для подтверждения того, что omit_from_start находится между нулем и длиной меньше минус omit_from_end или что omit_from_end меньше длины - omit_from_start

...