Я смотрю, как сделать файл ввода и вывода в Python. Я написал следующий код, чтобы прочитать список имен (по одному на строку) из файла в другой файл, проверяя имя по именам в файле и добавляя текст к вхождениям в файле. Код работает. Можно ли сделать это лучше?
Я хотел бы использовать with open(...
оператор как для входных, так и для выходных файлов, но не вижу, как они могут быть в одном и том же блоке, то есть мне нужно хранить имена во временном местоположении.
def filter(txt, oldfile, newfile):
'''\
Read a list of names from a file line by line into an output file.
If a line begins with a particular name, insert a string of text
after the name before appending the line to the output file.
'''
outfile = open(newfile, 'w')
with open(oldfile, 'r', encoding='utf-8') as infile:
for line in infile:
if line.startswith(txt):
line = line[0:len(txt)] + ' - Truly a great person!\n'
outfile.write(line)
outfile.close()
return # Do I gain anything by including this?
# input the name you want to check against
text = input('Please enter the name of a great person: ')
letsgo = filter(text,'Spanish', 'Spanish2')
filter()
является встроенной функцией , и поэтому вы , вероятно , следует выбрать другое имя для функции.filter()
), она будет найдена до встроеннойfilter()
Ответы:
Python позволяет поместить несколько
open()
операторов в одинwith
. Вы разделяете их запятыми. Ваш код будет тогда:И нет, вы ничего не получите, поставив явное
return
в конце своей функции. Вы можете использовать,return
чтобы выйти рано, но у вас было это в конце, и функция выйдет без него. (Конечно, с функциями, которые возвращают значение, вы используетеreturn
для указания возвращаемого значения.)Использование нескольких
open()
предметов сwith
не поддерживалось в Python 2.5, когдаwith
вводился оператор, или в Python 2.6, но оно поддерживается в Python 2.7 и Python 3.1 или новее.http://docs.python.org/reference/compound_stmts.html#the-with-statement http://docs.python.org/release/3.1/reference/compound_stmts.html#the-with-statement
Если вы пишете код, который должен работать на Python 2.5, 2.6 или 3.0, вложите
with
операторы в соответствии с другими предложенными или используемыми ответамиcontextlib.nested
.источник
Используйте вложенные блоки, как это,
источник
Вы можете вложить свои блоки. Как это:
Это лучше, чем ваша версия, потому что вы гарантируете, что
outfile
она будет закрыта, даже если ваш код встречает исключения. Очевидно, что вы можете сделать это с помощью try / finally, ноwith
это правильный способ сделать это.Или, как я только что узнал, вы можете иметь несколько контекстных менеджеров в операторе with, как описано в @steveha . Мне кажется, это лучший вариант, чем вложение.
И для вашего последнего незначительного вопроса, возвращение не имеет смысла. Я бы удалил это.
источник
Иногда вам может понадобиться открыть переменное количество файлов и обращаться с ними одинаково, вы можете сделать это с
contextlib
источник