Быстрый и компактный подход может быть:
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
, создании списка и выражения генератора соответственно.
Далее отметим, что, несмотря на упоминание «строк» и «файлов», эти функции очень, намного более общие - они будут работать на любой итерируемый, будь то открыть файл или любой другой, возвращая список (или генератор) элементов на основе их прогрессивных номеров элементов. Итак, я бы предложил использовать более подходящие общие имена; -).