python中打开文件open_如何在python中使用”with open”打开多个文件?

我想一次修改几个文件,如果我能把它们都写下来。我想知道我是否可以将多个打开的调用与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

...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值