【问题标题】:opening & closing file without file object in python在python中打开和关闭没有文件对象的文件
【发布时间】:2014-02-27 13:30:59
【问题描述】:

使用文件对象打开和关闭文件:

fp=open("ram.txt","w")
fp.close()

如果我们想在不使用文件对象的情况下打开和关闭文件,即;

open("ram.txt","w")

我们需要写close("poem.txt") 还是写close() 可以吗?

他们都没有给出任何错误......

只写 close() ,它如何理解我们引用的文件?

【问题讨论】:

  • 如果您不将open 的输出分配给变量,文件将被打开并随后关闭。您无法关闭它,也无法写入它,因为您没有要引用的文件变量。
  • @JoshG79,错了,我们仍然可以在没有文件对象的情况下读写 open("ram.txt","w").readlines() open("ram.txt","w" ).writelines("YOYO")
  • @user3223301: open() 返回的文件对象只要需要评估整个表达式就会存在,然后它会自动被垃圾收集(并关闭),因为没有不再引用它。
  • @RemcoGerlich,我也是这么想的... :) :)

标签: python


【解决方案1】:

对于内存中的每个对象,Python 都会保留一个引用计数。只要周围不再有对某个对象的引用,它就会被垃圾回收。

open() 函数返回一个文件对象

f = open("myfile.txt", "w")

在上面的行中,您在变量f 中保留了对该对象的引用,因此文件对象保持存在。如果你这样做了

del f

那么文件对象就没有引用了,会被清理掉。它将在此过程中关闭,但这可能需要一点时间,这就是为什么最好使用 with 构造。

但是,如果你这样做:

open("myfile.txt")

然后文件对象被创建并立即再次丢弃,因为没有对它的引用。没了,关门了。你不能关闭它了,因为你不能说出你到底想关闭什么。

open("myfile.txt", "r").readlines()

为了评估整个表达式,首先调用open,它返回一个文件对象,然后调用方法readlines。然后返回结果。由于现在没有对文件对象的引用,它会立即再次被丢弃。

【讨论】:

    【解决方案2】:

    如果我正确理解问题,我会使用with open(...)。 这个答案可能会帮助你What is the python keyword "with" used for?

    【讨论】:

    • 但是,如果使用with open(...),您仍然不必担心close()
    • 没错,这就是我喜欢与 open(...) 一起使用的原因。更强大,因为您不必担心关闭文件流。
    【解决方案3】:

    回答您的实际问题...一个文件对象(当您调用open 时返回的内容)具有对其中文件的引用。因此,当您执行以下操作时:

    fp = open(myfile, 'w')
    fp.write(...)
    fp.close()
    

    以上所有内容,包括writeclose,都知道它们引用了myfile,因为这是与fp 关联的文件。我不确定fp.close(myfile) 究竟做了什么,但它打开后肯定不需要文件名。

    更好的结构,例如

    with open(myfile,'w') as fp:
        fp.write(...)
    

    不要改变它;在这种情况下,fp 也是一个上下文管理器,但仍然包含指向 myfile 的指针;不用提醒。

    【讨论】:

      猜你喜欢
      • 2013-07-01
      • 2023-04-03
      • 1970-01-01
      • 2021-11-24
      • 2017-10-15
      • 2023-03-12
      • 2021-11-19
      • 2020-11-19
      • 1970-01-01
      相关资源
      最近更新 更多