file
我有一个打开的文件对象:
with open("text.txt","rb") as file:\n # read some line\n\nfile.write("texte") # I know that doesn't work\n
Run Code Online (Sandbox Code Playgroud)\n我只是想知道是否可以再次打开这个文件,因为Python有关于它的所有信息,但它说这个文件已关闭。\n我试图读取文件中的一些行,最后我会写文件末尾有一个新行,所以我想以追加模式重新打开该文件。
\n>>> with open("test.txt","wb") as fich:\n... fich.write("test In ")\n...\n>>> fich\n<closed file 'test.txt', mode \xe2\x80\x98wb' at 0x7f3f49a3a4b0>\n>>> fich.open\nTraceback (most recent call last):\n File \xe2\x80\x9c<stdin>", line 1, in <module>\n
Run Code Online (Sandbox Code Playgroud)\n我正在调用一个以文件句柄作为参数的函数,所以我不能第一次重用打开,因为文件的名称在函数内部是未知的。
\n我可以重新打开手柄吗?因为我可以使用相同的方法并重新打开它:
\nwith open("filename") as anotherfile:\n
Run Code Online (Sandbox Code Playgroud)\n
很简单:重新打开文件:
with open("text.txt","r") as file:
#read some line
with open(file.name,"a") as file:
file.write("texte") # now it works
Run Code Online (Sandbox Code Playgroud)
现在您在评论中提到:
我将此文件句柄作为函数调用中的参数传递,因此函数内部不知道文件名,因此在函数内部不可能使用相同的方法重新打开文件,这就是为什么我问如何重新打开文件文件句柄
现在事情变得越来越混乱了。一般规则是函数不应关闭/重新打开调用者提供的资源,即:
def foo(fname):
with open(fname) a file:
bar(file)
def bar(file):
file.close()
with open(file.name, "a") as f2:
f2.write("...")
Run Code Online (Sandbox Code Playgroud)
是不好的做法 - 这里不应该关闭文件,只使用它 - 处理文件是(或任何打电话的人)bar
的职责。因此,如果您需要这样的模式,那么您的设计就有问题,您最好先修复您的设计。foo
bar
请注意,您可以打开文件进行附加,而无需关闭第一个句柄:
def bar(file):
with open(file.name, "a") as f2:
f2.write("...")
Run Code Online (Sandbox Code Playgroud)
但这可能仍然会扰乱呼叫者的期望。