Это самая короткая форма:
for line in open(filename):
if line.startswith('#'):
continue
# PROCESS LINE HERE
Метод startswith()
в строке возвращает True, если строка, в которой вы вызываете его, начинается со строки, которую вы передали.
Хотя в некоторых случаях, например, в сценариях оболочки, это нормально, у него две проблемы. Во-первых, он не определяет, как открыть файл. Режим открытия файла по умолчанию - 'r'
, что означает «чтение файла в двоичном режиме». Поскольку вы ожидаете текстовый файл, лучше открыть его с помощью 'rt'
. Хотя это различие не имеет отношения к UNIX-подобным операционным системам, оно важно для Windows (и для Mac с пред-OS X).
Вторая проблема - дескриптор открытого файла. Функция open()
возвращает файловый объект, и рекомендуется закрывать файлы, когда вы закончите с ними. Для этого вызовите метод close()
объекта. Теперь Python , вероятно, сделает это за вас, в конце концов; в объектах Python подсчитывается по ссылкам, а когда счетчик ссылок объекта обнуляется, он освобождается, и в некоторый момент после объект освобожден Python вызовет свой деструктор (специальный метод __del__
). Обратите внимание, что я сказал , вероятно: У Python плохая привычка не вызывать деструктор для объектов, число ссылок которых падает до нуля незадолго до завершения программы. Я думаю, это спешит!
Для недолговечных программ, таких как сценарии оболочки, и особенно для файловых объектов, это не имеет значения. Ваша операционная система автоматически очистит все дескрипторы файлов, оставленные открытыми, когда программа завершится. Но если вы открыли файл, прочитали его содержимое, а затем начали длинное вычисление без явного закрытия дескриптора файла, Python, вероятно, оставит дескриптор файла открытым во время ваших вычислений. И это плохая практика.
Эта версия будет работать в любой версии 2.x Python и исправляет обе проблемы, которые я обсуждал выше:
f = open(file, 'rt')
for line in f:
if line.startswith('#'):
continue
# PROCESS LINE HERE
f.close()
Это лучшая общая форма для старых версий Python.
Как предполагает Стивеха, использование выражения «с» теперь считается наилучшей практикой. Если вы используете 2.6 или выше, вы должны написать это так:
with open(filename, 'rt') as f:
for line in f:
if line.startswith('#'):
continue
# PROCESS LINE HERE
Оператор "with" очистит дескриптор файла для вас.
В своем вопросе вы сказали «строки, начинающиеся с #», вот что я вам здесь показал. Если вы хотите отфильтровать строки, начинающиеся с необязательных пробелов и , а затем с '#', вы должны удалить пробелы перед поиском '#'. В этом случае вы должны изменить это:
if line.startswith('#'):
к этому:
if line.lstrip().startswith('#'):
В Python строки являются неизменяемыми, поэтому это не меняет значение line
. Метод lstrip()
возвращает копию строки со всеми удаленными начальными пробелами.