我正在读取数据文件(文本),并生成许多报告,每个报告都写入不同的输出文件(也是文本).我正在打开它们:
fP = open('file1','w')
invP = open('inventory','w')
orderP = open('orders','w')
......等等,最后有一组相应的close()行.
如果我可以使用for循环打开它们,使用fP名称和文件名列表,我可以保证关闭相同的文件.
我尝试使用字典fp:filename,但[显然]不起作用,因为fP变量未定义,或字符串'fP'不是一个好的文件对象名称.
由于这些是输出文件,我可能不需要检查打开错误 - 如果我无法打开一个或多个,我无论如何都无法继续.
有没有办法在循环中从名称列表中打开一组文件(不超过10个左右)?
好消息!Python 3.3带来了一种标准的安全方式:
来自文档:
每个实例都维护一堆已注册的回调函数,这些回调函数在实例关闭时以相反的顺序调用.
(...)
由于以与注册相反的顺序调用已注册的回调,因此最终表现为好像多个嵌套with语句已与已注册的回调集一起使用.
以下是如何使用它的示例:
from contextlib import ExitStack
with ExitStack() as stack:
files = [
stack.enter_context(open(filename))
for filename in filenames
]
# ... use files ...
Run Code Online (Sandbox Code Playgroud)
当代码离开with语句时,将关闭所有已打开的文件.
这样你也知道如果打开2个文件然后第三个文件无法打开,那么两个已经打开的文件将被正确关闭.此外,如果在with块内随时引发异常,您将看到正确的清理.
是的,您可以使用列表理解:
filenames = ['file1.txt', 'file2.txt', 'file3.txt'...]
filedata = {filename: open(filename, 'w') for filename in filenames}
Run Code Online (Sandbox Code Playgroud)
现在,所有打开的实例都保存在filedata,分配给文件名.
要关闭它们:
for file in filedata.values():
file.close()
Run Code Online (Sandbox Code Playgroud)
使用with关键字确保打开的文件(和其他类似资源,称为“上下文管理器”)已关闭:
with open(file_path, 'w') as output_file:
output_file.write('whatever')
Run Code Online (Sandbox Code Playgroud)
退出with块后,文件将被正确关闭——即使发生异常。
您可以轻松地循环所需文件的路径列表:
files = ['fp1.txt', 'inventory', 'orders']
for file in files:
with open(file, 'w') as current_file:
current_file.do_some_stuff()
Run Code Online (Sandbox Code Playgroud)
既然你说有很多数据文件。而不是手动将文件名输入到列表中。你可以用这个把文件名放到一个列表中。
from os import listdir
from os.path import isfile, join
files_in_dir = [ f for f in listdir('/home/cam/Desktop') if isfile(join('/home/cam/Desktop',f)) ]
Run Code Online (Sandbox Code Playgroud)
现在你可以
for file in files_in_dir:
with open(file, 'w') as f:
f.do_something
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13126 次 |
| 最近记录: |