Чтение n строк из конца текстового файла с использованием Python - PullRequest
0 голосов
/ 30 июня 2019

Я пытаюсь написать программу для чтения и печати последних n строк текстового файла на python.Мой текстовый файл имеет 74 строки.Я написал функцию, подобную приведенной ниже, чтобы прочитать последние n строк.

s=74 //Got this using another function, after enumerating the text file
n=5//

def readfile(x):
    print("The total number of lines in the file is",s)
    startline=(s-n)
    print("The last",n,"lines of the file are")
    with open(x,'r') as d:
        for i, l in enumerate(d):
            if (i>=startline):
                print(i)
                print(d.readline())`

Мой желаемый вывод:

The total number of lines in the file is 74
The last 5 lines of the file are
69
Resources resembled forfeited no to zealously. 
70
Has procured daughter how friendly followed repeated who surprise. 
71
Great asked oh under on voice downs. 
72
Law together prospect kindness securing six. 
73
Learning why get hastened smallest cheerful.

Но после запуска мойвывод выглядит так:

The total number of lines in the file is 74
69
Has procured daughter how friendly followed repeated who surprise. 

70
Law together prospect kindness securing six. 

71

Перечисленные индексы искажены строками и не все напечатаны.Кроме того, цикл печатает пробелы для индексов 72 и 73.

, если я закомментирую следующую строку в моей функции:

`#print(d.readline())`  

Мой вывод тогда станет:

The total number of lines in the file is 74
The last 5 lines of the file are
69
70
71
72
73

Пробелы исчезли, и все индексы напечатаны.Я не могу выяснить, почему некоторые индексы и строки не печатаются при добавлении print(d.readline()) в функцию.И почему напечатанный индекс и строки не совпадают.

Ответы [ 3 ]

0 голосов
/ 30 июня 2019

Вы можете использовать функцию Python readlines() для чтения вашего файла в виде списка строк. Затем вы можете использовать len(), чтобы определить, сколько строк в возвращаемом списке:

n = 5

def readfile(x):
    with open(x) as f_input:
        lines = f_input.readlines()

    total_lines = len(lines)
    print(f"The total number of lines in the file is {total_lines}.")    
    print(f"The last {n} lines of the file are:")

    for line_number in range(total_lines-n, total_lines):
        print(f"{line_number+1}\n{lines[line_number]}",  end='')


readfile('input.txt')

Вы также можете добавить f в качестве префикса к вашей строке, затем Python интерпретирует строку как содержащую имена переменных, когда она заключена в {}, что упрощает форматирование текста.

0 голосов
/ 30 июня 2019

Кажется немного неэффективным читать файл дважды, но, поскольку вы уже сделали это, вы можете легко сделать то, что вы хотите, используя collections.deque следующим образом:

from collections import deque


def print_last_lines(filename, linecount, n):

    # Get the last n lines of the file.
    with open(filename) as file:
        last_n_lines = deque(file, n)

    print("The total number of lines in the file is", linecount)
    print("The last", n, "lines of the file are:")

    for i, line in enumerate(last_n_lines, 1):
        print(linecount-n+i)
        print(line, end='')


filename = 'lastlines.txt'
n = 5

# Count lines in file.
with open(filename) as file:
    linecount = len(list(file))

print_last_lines(filename, linecount, n)
0 голосов
/ 30 июня 2019

Вы можете сделать это прямо сейчас, с readlines() и print(v):

n = 5

with open(x, 'r') as fp:

    lines = fp.readlines()
    total_length = len(lines)
    threshold = total_length - n

    for i, v in enumerate(lines): 
        if i >= threshold:
            print(i, v)
...