Это не всегда хорошая идея (или, возможно, даже возможная) использовать аргумент readlines()
без аргумента, поскольку он будет считываться во всем файле и потенциально потреблять большую часть памяти —, и это может не понадобиться, если вы Всем нужно сразу, в зависимости от того, что вы делаете.
Итак, одним из способов сделать то, что вы хотите, является использование функции генератора Python для извлечения только строк или значений, необходимых из файла. Их очень легко создать, по сути, вы просто используете операторы yield
для возврата значений вместо return
. С точки зрения программирования основное различие между ними заключается в том, что выполнение будет продолжено с помощью строки, следующей за оператором yield
, в следующий раз, когда вызывается функция, а не из первой строки, как это обычно бывает. Это означает, что их внутреннее состояние автоматически сохраняется между последующими вызовами, что упрощает сложную обработку внутри них.
Вот довольно минимальный пример использования одного, чтобы получить только нужные данные из файла, поэтапно, по одной строке в то время, чтобы не хватать памяти для хранения всего файла:
def read_data(filename):
with open(filename, 'rt') as file:
next(file); next(file) # ignore first two lines
value = next(file).rstrip('\n') # read what should be the first number
while value != '#extra': # not end-of-numbers marker
yield value
value = next(file).rstrip('\n')
for number in read_data('mydatafile'):
# process each number string produced
конечно, вы все еще можете собрать их всех вместе в список, если вы хотите, как это:
numbers = list(read_data('mydatafile'))
Как вы можете видеть, что это можно делать другие полезные вещи в функции, такие как проверка формата данных файла или предварительная обработка его другими способами. В приведенном выше примере я немного сделал это, удалив символы новой строки. readlines()
оставляет в каждой строке списка, который он возвращает. Было бы тривиально также преобразовать каждое строковое значение в целое число, используя yield int(value)
вместо yield value
.
Надеюсь, это даст вам достаточно информации о том, что возможно, и о компромиссах, связанных с выбором того, какой подход использовать для выполнения поставленной задачи.
Вы могли бы избавиться от новых строк почти одновременно с 'read = myfile.read(). Splitlines() [2: -2]'. – martineau
Обратите внимание, что '.strip()' также будет удалять любое ведущее/конечное пространство или вкладку. Вы можете использовать 'number.rstrip (" \ n ")', чтобы этого избежать. (это не относится к вопросу OP, но может быть полезно для тех, кто это читает) – bfontaine