The with open
模式很好,但在这种情况下它会妨碍你。您可以打开文件列表,然后在其中使用该列表izip
:
filenames = ["sample1/err_msdCECfortran_nvt.dat",...]
files = [open(i, "r") for i in filenames]
for rows in izip(*files):
# rows is now a tuple containing one row from each file
在 Python 3.3+ 中你还可以使用ExitStack https://docs.python.org/3.4/library/contextlib.html#contextlib.ExitStack in a with
block:
filenames = ["sample1/err_msdCECfortran_nvt.dat",...]
with ExitStack() as stack:
files = [stack.enter_context(open(i, "r")) for i in filenames]
for rows in zip(*files):
# rows is now a tuple containing one row from each file
在 Python with凭借其所有优点(例如,无论您如何退出块都会及时关闭),您需要创建自己的上下文管理器:
class FileListReader(object):
def init(self, filenames):
self.files = [open(i, "r") for i in filenames]
def __enter__(self):
for i in files:
i.__enter__()
return self
def __exit__(self, exc_type, exc_value, traceback):
for i in files:
i.__exit__(exc_type, exc_value, traceback)
然后你可以这样做:
filenames = ["sample1/err_msdCECfortran_nvt.dat",...]
with FileListReader(filenames) as f:
for rows in izip(*f.files):
#...
不过,在这种情况下,最后一个可能被认为是过度设计。