嵌套';与';Python中的语句

嵌套';与';Python中的语句,python,append,with-statement,Python,Append,With Statement,事实证明,在互联网上搜索“with”是一个有趣的词 有人知道用python嵌套语句的好处吗? 我一直在跟踪我所写脚本中的一个非常狡猾的错误,我怀疑这是因为我正在这样做: with open(file1) as fsock1: with open(file2, 'a') as fsock2: fstring1 = fsock1.read() fstring2 = fsock2.read() 当我试图从fsock2中读取()时,Python就会抛出。在调试器

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

有人知道用python嵌套语句的好处吗?
我一直在跟踪我所写脚本中的一个非常狡猾的错误,我怀疑这是因为我正在这样做:

with open(file1) as fsock1:
    with open(file2, 'a') as fsock2:
        fstring1 = fsock1.read()
        fstring2 = fsock2.read()
当我试图从fsock2中读取()时,Python就会抛出。在调试器中检查时,这是因为它认为文件为空。这并不令人担忧,除非在调试interperter中运行完全相同的代码,而不是在
with
语句中运行,这表明文件实际上充满了文本


我将继续假设现在用语句嵌套
是不可以的,但是如果任何了解更多的人有不同的意见,我很乐意听到。

AFAIK你不能读取用append模式打开的文件
'a'
语句嵌套
没有问题,您正在为append打开
file2
,因此无法从中读取

如果您确实不喜欢使用
语句嵌套
,无论出于何种原因,您通常可以通过函数避免这种情况。然而,它不会使坏代码(例如,打开一个文件进行追加然后尝试读取它的代码)工作,也不会用
语句进行词汇嵌套来破坏本来好的代码

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

我认为这是因为它实际上什么都看不懂。即使可以,当您附加到文件时,seek指针也会移动到文件的末尾,以准备写入

这些带有语句的
对我来说很好:

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):
   ...

这里的上下文管理器一次创建一个。这意味着,如果文件2的打开失败(比如说,因为它不存在),那么您将无法正确地完成文件1,您将不得不将其留给垃圾收集器。这可能是一件非常糟糕的事情。

至于搜索“with”,在单词前面加“+”可以防止google忽略它。

我在python的文档中找到了解决方案。你可能想看看或者

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

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

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

我刚意识到同样的事情,就要对自己的问题发表评论。我觉得。。。现在很傻,这以前是真的。现在你必须用引号把它括起来,即用“
”括起来。这不是对眼前问题的回答(是的,我知道这个问题已经有10年了)