Вопрос-Ответ

How to read specific lines from a file (by line number)?

Как прочитать определенные строки из файла (по номеру строки)?

Я использую for цикл для чтения файла, но я хочу прочитать только определенные строки, скажем, строку #26 и #30. Есть ли какая-либо встроенная функция для достижения этого?

Переведено автоматически
Ответ 1

Если файл для чтения большой, и вы не хотите читать весь файл в памяти сразу:

fp = open("file")
for i, line in enumerate(fp):
if i == 25:
# 26th line
elif i == 29:
# 30th line
elif i > 29:
break
fp.close()

Обратите внимание, что i == n-1 для n-й строки.


В Python 2.6 или более поздней версии:

with open("file") as fp:
for i, line in enumerate(fp):
if i == 25:
# 26th line
elif i == 29:
# 30th line
elif i > 29:
break
Ответ 2

Быстрый ответ:

f=open('filename')
lines=f.readlines()
print lines[25]
print lines[29]

или:

lines=[25, 29]
i=0
f=open('filename')
for line in f:
if i in lines:
print i
i+=1

Существует более элегантное решение для извлечения большого количества строк: linecache (любезно предоставлено "python: как перейти к определенной строке в огромном текстовом файле?", предыдущий pythonly.ru вопрос).

Цитирую документацию python по ссылке выше:

>>> import linecache
>>> linecache.getline('/etc/passwd', 4)
'sys:x:3:3:sys:/dev:/bin/sh\n'

Измените 4 на желаемый номер строки, и все готово. Обратите внимание, что 4 приведет к пятой строке, поскольку счетчик основан на нуле.

Если файл может быть очень большим и вызывать проблемы при чтении в память, было бы неплохо воспользоваться советом @Alok и использовать enumerate().

В заключение:


  • Используйте fileobject.readlines() или for line in fileobject как быстрое решение для небольших файлов.

  • Используйте linecache для более элегантного решения, которое будет довольно быстрым для чтения многих файлов, возможно многократного.

  • Воспользуйтесь советом @ Alok и используйте enumerate() для файлов, которые могут быть очень большими и не помещаются в память. Обратите внимание, что использование этого метода может замедлиться, поскольку файл читается последовательно.

Ответ 3

Ради предложения другого решения:

import linecache
linecache.getline('Sample.txt', Number_of_Line)

Я надеюсь, что это быстро и просто :)

Ответ 4

Быстрый и компактный подход может быть:

def picklines(thefile, whatlines):
return [x for i, x in enumerate(thefile) if i in whatlines]

это принимает любой открытый файлоподобный объект thefile (оставляя на усмотрение вызывающего объекта, следует ли открывать его из файла на диске или, например, через сокет или другой файлоподобный поток) и набор индексов строк на основе нуля whatlines, и возвращает список с небольшим объемом памяти и разумной скоростью. Если количество возвращаемых строк велико, вы можете предпочесть генератор:

def yieldlines(thefile, whatlines):
return (x for i, x in enumerate(thefile) if i in whatlines)

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

Далее обратите внимание, что, несмотря на упоминание "строк" и "файла", эти функции намного, намного более общие - они будут работать с любым итерируемым файлом, будь то открытый файл или любой другой, возвращая список (или генератор) элементов на основе их прогрессивных номеров элементов. Итак, я бы предложил использовать более подходящие общие имена;-).

python file