如何使用open with语句打开文件

我正在研究如何在Python中进行文件input和输出。 我已经写了下面的代码,从一个文件中读取一个名称列表(每行一个)到另一个文件中,同时检查一个名称与文件中的名称,并将文本附加到文件中的出现位置。 代码工作。 能做得更好吗?

我想使用with open(...语句的input和输出文件,但不能看到他们可能在同一块意味着我需要将名称存储在临时位置。

 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') 

Python允许将多个open()语句放在with 。 你用逗号分开它们。 您的代码将是:

 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. ''' with open(newfile, 'w') as outfile, 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) # input the name you want to check against text = input('Please enter the name of a great person: ') letsgo = filter(text,'Spanish', 'Spanish2') 

不,你没有得到任何东西,在你的函数结束时明确的return 。 你可以使用return来尽早退出,但是最后退出了,函数将会退出。 (当然,如果函数返回值,则使用return值来指定要返回的值。)

在2.5引入with语句时,Python 2.5不支持使用多个open()项,但在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.0或3.0中运行的代码,请按照build议的其他答案嵌套with语句或使用contextlib.nested

像这样使用嵌套块,

 with open(newfile, 'w') as outfile: with open(oldfile, 'r', encoding='utf-8') as infile: #your logic goes here 

你可以嵌套你的块。 喜欢这个:

 with open(newfile, 'w') as outfile: 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) 

这比你的版本更好,因为你保证即使你的代码遇到exception, outfile也会被closures。 显然你可以用try / finally来做到这一点,但是with正确的方法来做到这一点。

或者,正如我刚刚所了解的,您可以在@steveha中描述的with语句中使用多个上下文pipe理器。 这似乎是比嵌套更好的select。

而对于你最后的小问题,回报没有任何真正的目的。 我会删除它。