如何在Python中打开文件列表

ZZM*_*ike 7 python file

我正在读取数据文件(文本),并生成许多报告,每个报告都写入不同的输出文件(也是文本).我正在打开它们:

fP = open('file1','w')

invP = open('inventory','w')

orderP = open('orders','w')

......等等,最后有一组相应的close()行.

如果我可以使用for循环打开它们,使用fP名称和文件名列表,我可以保证关闭相同的文件.

我尝试使用字典fp:filename,但[显然]不起作用,因为fP变量未定义,或字符串'fP'不是一个好的文件对象名称.

由于这些是输出文件,我可能不需要检查打开错误 - 如果我无法打开一个或多个,我无论如何都无法继续.

有没有办法在循环中从名称列表中打开一组文件(不超过10个左右)?

Kos*_*Kos 8

好消息!Python 3.3带来了一种标准的安全方式:

contextlib.ExitStack

来自文档:

每个实例都维护一堆已注册的回调函数,这些回调函数在实例关闭时以相反的顺序调用.
(...)
由于以与注册相反的顺序调用已注册的回调,因此最终表现为好像多个嵌套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块内随时引发异常,您将看到正确的清理.


A.J*_*pal 7

是的,您可以使用列表理解:

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)

  • 这种方法还需要对所有内容进行“try/finally”,以确保在某处出现异常或提前退出时关闭打开的文件。 (2认同)

gra*_*irt 5

使用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)


Aja*_*jay 5

既然你说有很多数据文件。而不是手动将文件名输入到列表中。你可以用这个把文件名放到一个列表中。

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)