How to read specific lines from a file (by line number)?
Как прочитать определенные строки из файла (по номеру строки)?
Я использую for цикл для чтения файла, но я хочу прочитать только определенные строки, скажем, строку #26 и #30. Есть ли какая-либо встроенная функция для достижения этого?
Переведено автоматически
Ответ 1
Если файл для чтения большой, и вы не хотите читать весь файл в памяти сразу:
fp = open("file") for i, line inenumerate(fp): if i == 25: # 26th line elif i == 29: # 30th line elif i > 29: break fp.close()
Обратите внимание, что i == n-1 для n-й строки.
В Python 2.6 или более поздней версии:
withopen("file") as fp: for i, line inenumerate(fp): if i == 25: # 26th line elif i == 29: # 30th line elif i > 29: break
Используйте fileobject.readlines() или for line in fileobject как быстрое решение для небольших файлов.
Используйте linecache для более элегантного решения, которое будет довольно быстрым для чтения многих файлов, возможно многократного.
Воспользуйтесь советом @ Alok и используйте enumerate() для файлов, которые могут быть очень большими и не помещаются в память. Обратите внимание, что использование этого метода может замедлиться, поскольку файл читается последовательно.
defpicklines(thefile, whatlines): return [x for i, x inenumerate(thefile) if i in whatlines]
это принимает любой открытый файлоподобный объект thefile (оставляя на усмотрение вызывающего объекта, следует ли открывать его из файла на диске или, например, через сокет или другой файлоподобный поток) и набор индексов строк на основе нуля whatlines, и возвращает список с небольшим объемом памяти и разумной скоростью. Если количество возвращаемых строк велико, вы можете предпочесть генератор:
defyieldlines(thefile, whatlines): return (x for i, x inenumerate(thefile) if i in whatlines)
который в основном хорош только для выполнения цикла - обратите внимание, что единственное отличие заключается в использовании округленных, а не квадратных скобок в return инструкции, что позволяет понимать список и выражение генератора соответственно.
Далее обратите внимание, что, несмотря на упоминание "строк" и "файла", эти функции намного, намного более общие - они будут работать с любым итерируемым файлом, будь то открытый файл или любой другой, возвращая список (или генератор) элементов на основе их прогрессивных номеров элементов. Итак, я бы предложил использовать более подходящие общие имена;-).