2

我想出了如何浏览目录并查找某种类型的文件并将它们添加到列表中。现在我有一个包含文件名称的列表。我如何打开所有这些?这是我到目前为止所拥有的:

import os
import glob
import subprocess

os.chdir("/Users/blah/Desktop/Data")
reflist = glob.glob('*raw_ref.SDAT')
actlist = glob.glob('*raw_act.SDAT')

for i in reflist:
    os.popen("%r" %i)

for j in actlist:
    os.popen("%r" %j)

PS我在Mac上

4

3 回答 3

4
ref_files = map(open, reflist)

或者,如果您想更好地控制以下参数open()

ref_files = [open(filename, ...) for filename in reflist]
于 2013-08-29T18:26:58.827 回答
4

我建议同时打开尽可能少的文件。

for file in reflist:
    with open(file) as f:
        pass # do stuff with f
    # when with block ends, f is closed

for file in actlist:
    with open(file) as f:
        pass # do stuff with f
    # when with block ends, f is closed

如果您出于某种原因需要同时打开所有文件(我认为这不太可能),那么请使用 NPE 的解决方案。

请记住,当您不对文件 I/O 使用上下文管理器时(就像with这里使用的那样),您需要在完成后手动关闭文件。

于 2013-08-29T18:32:20.347 回答
0

@Brian 说得对:“我建议同时打开尽可能少的文件。” 然而,这取决于你想要做什么。如果您需要几个打开的文件来阅读,您可以尝试这样做以确保文件最后关闭:

# I don't know MAC path names.
filenames = ['/path/to/file', 'next/file', 'and/so/on']
# here the file descriptors are stored:
fds = []
try:
    for fn in filenames:
        # optional: forgive open errors and process the accessible files
        #try:
            fds.append(open(fn))
        #except IOError:
        #    pass

    # here you can read from files and do stuff, e.g. compare lines
    current_lines = [fd.readline() for fd in fds]
    # more code

finally:
    for fd in fds:
        fd.close()
于 2013-08-29T19:48:00.417 回答