Я пытаюсь сделать что-то вроде этогоиспользуя readlines два раза подряд в Python
Lines = file.readlines()
# do something
Lines = file.readlines()
, но во второй раз Линии пусто. Это нормально?
Я пытаюсь сделать что-то вроде этогоиспользуя readlines два раза подряд в Python
Lines = file.readlines()
# do something
Lines = file.readlines()
, но во второй раз Линии пусто. Это нормально?
Да, потому что .readlines()
продвигает указатель файла в конец файла.
Почему бы просто не сохранить копию строк в переменной?
file_lines = file.readlines()
Lines = list(file_lines)
# do something that modifies Lines
Lines = list(file_lines)
Это будет намного эффективнее, чем ударить диск дважды. (Обратите внимание, что вызов list()
необходимо создать копию списка, так что изменения Lines
не повлияет file_lines
.)
Ваша техника здесь устанавливает 'Lines' в тот же объект Python, что и' file_lines'. Все, что мутирует одно, будет мутировать другое, поскольку они являются одним и тем же объектом. Чтобы быть в безопасности, вам нужно сделать 'lines = file_lines [:]' или каким-либо другим способом сделать фактическую копию. Кстати, стандарт PEP 8 предполагает использование нижнего регистра для имен переменных и резервирование смешанного случая для классов, поэтому я предлагаю изменить 'Lines' на просто' lines'. – steveha
@steveha - Я уже добавил 'list()' звонки. Что касается имени переменной, я просто повторно использовал имя OP, чтобы упростить чтение. Я согласен с вами в том, что в нижнем регистре лучше. – Amber
Приношу свои извинения. Я не уверен, как я пропустил оболочку 'list()', но я это сделал. Извини за это. – steveha
Вам нужно сбросить указатель файла с помощью
file.seek(0)
перед использованием
file.readlines()
еще раз.
Или сохраните копию строк. – agf
Также ищите перед публикацией. http://stackoverflow.com/questions/2106820/re-open-files-in-python – houbysoft