如何重新打开一个关闭的文件?

6

我有一个文件对象file,是通过以下方式打开的:

with open("text.txt","rb") as file:
    # read some line

file.write("texte")  # I know that doesn't work

我想知道是否可以重新打开这个文件,因为Python已经获取了所有关于它的信息,但是它显示这个文件已经关闭了。

我正在尝试读取文件中的一些行,在文件末尾写入新的一行,因此我想以追加模式重新打开这个文件。

>>> with open("test.txt","wb") as fich:
...     fich.write("test In ")
...
>>> fich
<closed file 'test.txt', mode ‘wb' at 0x7f3f49a3a4b0>
>>> fich.open
Traceback (most recent call last):
  File “<stdin>", line 1, in <module>

我正在调用一个需要文件句柄作为参数的函数,因此无法像第一次那样重复使用open(),因为函数内部未知文件名。

我能重新打开句柄本身吗?因为我可以使用同样的方法并重新打开它:

with open("filename") as anotherfile:

不,类似文件的对象并不知道它们是如何被创建的。 - chepner
最好复制并粘贴完整的堆栈跟踪,而不是提供截图。许多终端需要使用CTRL+SHIFT+C进行复制,而不仅仅是CTRL+C。你的问题在于fich引用了一个文件句柄,而该句柄已关闭。要再次打开文件,请按照之前的步骤执行:with open("test.txt", "a") as fich:... - Hans Musgrave
可能是What can I do with a closed file object?的重复问题。 - glibdud
@DJAMELDAHMANE 请查看我的回答。 - bruno desthuilliers
@bruno 我知道如何做,但那不是我想要的。 - DJAMEL DAHMANE
显示剩余4条评论
1个回答

4
简单来说:重新打开文件。
with open("text.txt","r") as file:
    #read some line

with open(file.name,"a") as file:
    file.write("texte") # now it works

现在你在评论中提到:
我正在将这个文件句柄作为参数传递给一个函数调用,所以函数内部不知道文件名,因此在函数内部无法使用相同的方法重新打开文件,这就是为什么我要问如何重新打开文件句柄。
现在情况变得混乱了。一般规则是,函数不应关闭/重新打开它的调用者给出的资源,例如:
def foo(fname):
    with open(fname) a file:
       bar(file)

def bar(file):
   file.close()
   with open(file.name, "a") as f2:
      f2.write("...")

这是一种不好的做法 - 这里的 bar 不应该关闭文件,只能使用它 - 处理文件的责任应该由 foo (或调用 bar 的人)承担。因此,如果您需要这样的模式,则说明您的设计存在问题,最好先修复您的设计。

请注意,您可以在不关闭第一个句柄的情况下打开文件以进行追加:

def bar(file):
   with open(file.name, "a") as f2:
      f2.write("...")

但这可能仍会破坏调用者的期望。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接