26

事实证明,“with”是一个在互联网上搜索的有趣词。

有谁知道在python中嵌套语句是什么意思?
我一直在跟踪我一直在编写的脚本中的一个非常滑的错误,我怀疑这是因为我正在这样做:

with open(file1) as fsock1:
    with open(file2, 'a') as fsock2:
        fstring1 = fsock1.read()
        fstring2 = fsock2.read()

当我尝试read()从 fsock2 开始时,Python 会抛出异常。在调试器中检查时,这是因为它认为文件是空的。这不会令人担忧,除非在调试解释器中运行完全相同的代码而不是在with语句中向我表明该文件实际上充满了文本......

我将继续假设现在嵌套with语句是不可以的,但是如果知道更多的人有不同的意见,我很想听听。

4

5 回答 5

44

我在 python 的文档中找到了解决方案。您可能想看看这个(Python 3)这个(Python 2)

如果您正在运行 python 2.7+,您可以像这样使用它:

with open(file1) as fsock1, open(file2, 'a') as fsock2:
    fstring1 = fsock1.read()
    fstring2 = fsock2.read()

这样可以避免不必要的缩进。

于 2014-12-18T16:20:45.957 回答
10

AFAIK 您无法读取使用附加模式打开的文件'a'

于 2010-01-02T02:23:06.393 回答
8

在调试器中检查时,这是因为它认为文件是空的。

我认为发生这种情况是因为它实际上无法读取任何内容。即使可以,当您追加到文件时,查找指针也会移动到文件的末尾以准备写入。

这些with陈述对我来说很好用:

with open(file1) as f:
    with open(file2, 'r') as g:   # Read, not append.
        fstring1 = f.read()
        fstring2 = g.read()

请注意contextlib.nested,正如另一位海报所建议的那样,使用 , 在这里可能充满危险。假设你这样做:

with contextlib.nested(open(file1, "wt"), open(file2)) as (f_out, f_in):
   ...

此处的上下文管理器一次创建一个。这意味着如果 file2 打开失败(例如,因为它不存在),那么您将无法正确完成 file1 并且您必须将其留给垃圾收集器。这可能是一件非常糟糕的事情。

于 2010-01-02T02:32:16.500 回答
2

嵌套语句没有问题with——相反,您正在file2为追加打开,因此您无法从中读取。

如果您不喜欢嵌套with语句,无论出于何种原因,您通常可以使用contextlib.nested函数来避免这种情况。但是,它不会使损坏的代码(例如,打开文件以进行追加然后尝试读取它的代码)起作用,词法嵌套with语句也不会破坏原本很好的代码。

于 2010-01-02T02:28:46.647 回答
-1

至于搜索“with”,用“+”作为前缀可以防止google忽略它。

于 2010-01-02T02:42:46.603 回答