Два простых вопроса о питоне - PullRequest
2 голосов
/ 30 мая 2009

У меня есть 2 простых вопроса о питоне:

1.Как узнать количество строк файла в python?

2.Как найти позицию в файловом объекте для последняя строка легко?

Ответы [ 9 ]

8 голосов
/ 30 мая 2009

строки - это просто данные, разделенные символом новой строки '\n'.

1) Поскольку строки имеют переменную длину, вам необходимо прочитать весь файл, чтобы узнать, где находятся символы новой строки, чтобы подсчитать, сколько строк:

count = 0
for line in open('myfile'):
    count += 1
print count, line # it will be the last line

2) чтение фрагмента из конца файла - самый быстрый способ найти последний символ новой строки.

def seek_newline_backwards(file_obj, eol_char='\n', buffer_size=200):
    if not file_obj.tell(): return # already in beginning of file
    # All lines end with \n, including the last one, so assuming we are just 
    # after one end of line char
    file_obj.seek(-1, os.SEEK_CUR)
    while file_obj.tell():
        ammount = min(buffer_size, file_obj.tell())
        file_obj.seek(-ammount, os.SEEK_CUR)
        data = file_obj.read(ammount)
        eol_pos = data.rfind(eol_char)
        if eol_pos != -1:
            file_obj.seek(eol_pos - len(data) + 1, os.SEEK_CUR)
            break
        file_obj.seek(-len(data), os.SEEK_CUR)

Вы можете использовать это так:

f = open('some_file.txt')
f.seek(0, os.SEEK_END)
seek_newline_backwards(f)
print f.tell(), repr(f.readline())
7 голосов
/ 30 мая 2009

Давайте не забудем

f = open("myfile.txt")
lines = f.readlines()

numlines = len(lines)
lastline = lines[-1]

ПРИМЕЧАНИЕ: это читает весь файл в памяти в виде списка. Имейте это в виду, если файл очень большой.

5 голосов
/ 30 мая 2009

Самый простой способ - просто прочитать файл в память. например:

f = open('filename.txt')
lines = f.readlines()
num_lines = len(lines)
last_line = lines[-1]

Однако для больших файлов это может занимать много памяти, так как весь файл загружается в ОЗУ. Альтернативой является перебирать файл строка за строкой. например:

f = open('filename.txt')
num_lines = sum(1 for line in f)

Это более эффективно, поскольку он не загружает весь файл в память, а только просматривает строку за раз. Если вам нужна также последняя строка, вы можете отслеживать строки во время итерации и получать оба ответа:

f = open('filename.txt')
count=0
last_line = None
for line in f:
    num_lines += 1
    last_line = line
print "There were %d lines.  The last was: %s" % (num_lines, last_line)

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

2 голосов
/ 30 мая 2009

Я бы тоже хотел добавить к другим решениям, что некоторые из них (те, кто ищет \n) не будут работать с файлами с окончаниями строк в стиле OS 9 (только \r), и что они могут содержать дополнительная пустая строка в конце, потому что многие текстовые редакторы добавляют ее по любопытным причинам, так что вы можете или не хотите добавлять проверку для нее.

2 голосов
/ 30 мая 2009

Для небольших файлов, которые умещаются в памяти, как насчет использования str.count() для получения количества строк файла:

line_count = open("myfile.txt").read().count('\n')
1 голос
/ 30 мая 2009

Единственный способ сосчитать строки [о которых я знаю] - это прочитать все строки, например:

count = 0
for line in open("file.txt"): count = count + 1

После цикла у count будет прочитано количество строк.

0 голосов
/ 02 мая 2018

Ответ1:

x = open("file.txt")

открывает файл или у нас есть x, связанный с file.txt

y = x.readlines()

возвращает все строки в списке

length = len(y)

возвращает длину списка в длину

или в одну строку

length = len(open("file.txt").readlines())

Ответ2:

last = y[-1]

возвращает последний элемент списка

0 голосов
/ 30 мая 2009

По первому вопросу уже есть несколько хороших, я предложу @ Brian's как лучший (самый питонический, с символом конца строки и эффективным с точки зрения памяти):

f = open('filename.txt')
num_lines = sum(1 for line in f)

Что касается второго, мне нравится один из @ nosklo, но его изменение должно быть более общим:

import os
f = open('myfile')
to = f.seek(0, os.SEEK_END)
found = -1
while found == -1 and to > 0:
  fro = max(0, to-1024)
  f.seek(fro)
  chunk = f.read(to-fro)
  found = chunk.rfind("\n")
  to -= 1024

if found != -1:
  found += fro

Он выполняет поиск кусочками по 1 КБ от конца файла до тех пор, пока не найдет символ новой строки или файл не закончится. В конце кода найден индекс последнего символа новой строки.

0 голосов
/ 30 мая 2009

Ответ на первый вопрос (остерегайтесь низкой производительности при работе с большими файлами при использовании этого метода):

f = open("myfile.txt").readlines()
print len(f) - 1

Ответ на второй вопрос:

f = open("myfile.txt").read()
print f.rfind("\n")

P.S. Да, я понимаю, что это подходит только для небольших файлов и простых программ. Я думаю, что я не буду удалять этот ответ, каким бы бесполезным он ни казался для реальных случаев использования.

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