我想一次修改几个文件,如果我能把它们都写下来。我想知道我是否可以将多个打开的调用与with语句结合起来:
1
2
3
4
5try:
with open('a', 'w') as a and open('b', 'w') as b:
do_something()
except IOError as e:
print 'Operation failed: %s' % e.strerror
如果不可能的话,这个问题的优雅解决方案会是什么样子?
的Python 2.7(或3.1,分别),你可以写
1
2with open('a', 'w') as a, open('b', 'w') as b:
do_something()
在早期版本的Python,你可以有时使用contextlib.nested()到巢的上下文管理者。这会不会是很多的工作文件-打开,虽然看到的链接的文档的详细信息。
在罕见的病例,你想打开一些文件,所有变量在同一时间,你可以使用Python版contextlib.ExitStack,从3.3开始:
1
2
3with ExitStack() as stack:
files = [stack.enter_context(open(fname)) for fname in filenames]
# Do something with"files"
大部分时间你可设置文件,你可能会想他们,另一开放后,虽然。
对。。很酷,在以前的python版本中,也有几行代码可以做到这一点,如本例中所示:metapython.blogspot.com/2010/12/…
不幸的是,根据contextlib.nested docs,您不应该使用它来打开文件:"使用nested()打开两个文件是一个编程错误,因为如果在打开第二个文件时引发异常,第一个文件将不会立即关闭。"
有没有办法用with打开文件的变量列表?
@蒙库特:很好的问题(你可以单独问这个问题)。简短回答:是的,从python 3.3开始有ExitStack。在任何早期版本的python中都不存在这样做的简单方法。
如果open()中的一个失败,可以确定它是哪个?我特别想能够给出一个详细的错误消息。
@johnauld:wrao在try/except块中完成整个过程,捕获异常并查看它。它应该具有具有所有所需信息的属性。
@蒙库特,你一定要问你的问题,因为我也有同样的问题。contextlib.exitstack似乎是答案。
是否可以跨多行使用这种语法?
@Tommy.Carstensen:您可以使用常规的行连续机制。您可能应该使用反斜杠行继续符在逗号处中断,如PEP9所建议的那样。
在我的任务中,我想从每个文件中一次读取一行。有可能吗?我想从两个文件中读取第一行,然后从两个文件中读取第二行,直到最后。这些文件的行数相同。
@thanos.a您可以使用for line_a, line_b in zip(a, b),其中a和b是上述两个文件对象。(一般来说,请先问一个新问题,而不是评论,或者更好地搜索现有问题。)
只为与你and,和完成:
1
2
3
4
5try:
with open('a', 'w') as a, open('b', 'w') as b:
do_something()
except IOError as e:
print 'Operation failed: %s' % e.strerror
您应该指定哪些版本的python支持这种语法。
如果文件在一次或多次开长文件路径,它可能是有用的在多事情上打破线。从Python风格指南中的建议:"斯文marnach评论另一个答案:
1
2
3with open('/path/to/InFile.ext', 'r') as file_1, \
open('/path/to/OutFile.ext', 'w') as file_2:
file_2.write(file_1.read())
通过这个缩进,我得到了:"flake8:视觉缩进的连续行过度缩进"
@Louism听起来像是来自您的编辑器或环境,而不是基本的python。如果它仍然是您的一个问题,我建议您创建一个与之相关的新问题,并提供关于您的编辑器和环境的更多细节。
是的,肯定是我的编辑,这只是一个警告。我想强调的是你的压痕不符合PEP8。第二个open()应该缩进8个空格,而不是与第一个空格对齐。
@路易斯佩普8是一个准则,而不是规则,在这种情况下,我肯定会忽略它。
是的,没问题,但是它可能对其他有自动过梁的人有用:)
将该语句的嵌套与工作,在我看来,更多的是straightforward处理。
让我们说你有一个infile.txt和想写它到outfile’s的两个同时进行。
1
2
3
4
5
6with open("inFile.txt", 'r') as fr:
with open("outFile1.txt", 'w') as fw1:
with open("outFile2.txt", 'w') as fw2:
for line in fr.readlines():
fw1.writelines(line)
fw2.writelines(line)
编辑:
不是我不明白downvote的原因。我在我的测试我的代码和它的作品出版所需的答案,它写道:到outfile’s的所有的问题,只是问。在失败的重复的写作或写。所以我真的很好奇为什么我知道答案是错误的或被认为是次优的,任何事情都是这样的。
我不知道其他人对你投了什么反对票,但我对你投了反对票,因为这是唯一一个有三个文件(一个输入,两个输出)的例子,正好是我需要的。
也许你在python>2.6中被否决了bcoz,你可以写更多的pythonic代码-gist.github.com/iaroslavr/3D8692E2A11EF902D2D8277EB88CB8(为什么我不能在注释中插入代码片段?)!)我们在2018年;)过去的古老版本
可能是因为最初的问题是要一个组合而不是一个巢。也就是说,筑巢似乎太明显了,不可能是问题所在。只是一个偶然的想法。无论如何,这是最普遍的答案。
3.3由于Python的类,可以使用从contextlibExitStack到安全模块一个开放的数字文件。
它可以管理的上下文感知的动态对象的数量,这意味着它将证明是有用的,如果你不知道如何你的许多文件要处理。
在事实上,这是典型的用例文档中提到的管理号码是动态文件。
1
2
3
4
5with ExitStack() as stack:
files = [stack.enter_context(open(fname)) for fname in filenames]
# All opened files will automatically be closed at the end of
# the with statement, even if attempts to open files later
# in the list raise an exception
如果你有兴趣在这里的细节,是一个通用的例子,为了解释如何操作:ExitStack
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30from contextlib import ExitStack
class X:
num = 1
def __init__(self):
self.num = X.num
X.num += 1
def __repr__(self):
cls = type(self)
return '{cls.__name__}{self.num}'.format(cls=cls, self=self)
def __enter__(self):
print('enter {!r}'.format(self))
return self.num
def __exit__(self, exc_type, exc_value, traceback):
print('exit {!r}'.format(self))
return True
xs = [X() for _ in range(3)]
with ExitStack() as stack:
print(len(stack._exit_callbacks)) # number of callbacks called on exit
nums = [stack.enter_context(x) for x in xs]
print(len(stack._exit_callbacks))
print(len(stack._exit_callbacks))
print(nums)
输出:
1
2
3
4
5
6
7
8
9
100
enter X1
enter X2
enter X3
3
exit X3
exit X2
exit X1
0
[1, 2, 3]
Python 2.6和它不会工作,我们要用下面的方式:开放式多文件
1
2with open('a', 'w') as a:
with open('b', 'w') as b:
(8 yrs晚回答),但有一个连接到多个文件,到下面的函数,可以帮助:
1
2
3
4
5
6
7
8
9
10
11
12
13def multi_open(_list):
out=""
for x in _list:
try:
with open(x) as f:
out+=f.read()
except:
pass
# print(f"Cannot open file {x}")
return(out)
fl = ["C:/bdlog.txt","C:/Jts/tws.vmoptions","C:/not.exist"]
print(multi_open(fl))
1
2
3
4
5
62018-10-23 19:18:11.361 PROFILE [Stop Drivers] [1ms]
2018-10-23 19:18:11.361 PROFILE [Parental uninit] [0ms]
...
# This file contains VM parameters for Trader Workstation.
# Each parameter should be defined in a separate line and the
...