python:如果我在关闭之前退出,打开的文件会发生什么?

时间:2010-08-04 16:15:22

标签: python

我正在打开一个csv文件:

def get_file(start_file): #opens original file, reads it to array
  with open(start_file,'rb') as f:
    data=list(csv.reader(f))
    header=data[0]
    counter=collections.defaultdict(int)
    for row in data:
      counter[row[10]]+=1
  return (data,counter,header)
如果我退出WITH循环中的程序,

文件是否保留在内存中?

当我退出程序而不将所有变量都设置为NULL时,程序内部的变量会发生什么变化?

3 个答案:

答案 0 :(得分:8)

当您的流程终止时,操作系统将自动关闭所有打开的文件描述符。

存储在内存中的文件数据(例如变量,Python缓冲区)将丢失。当文件被隐式关闭时,操作系统中缓冲的数据可能会刷新到磁盘(检查内核脏缓冲区的确切语义在这里是有教育意义的,尽管你不应该依赖它)。

当您的流程终止时,您的变量就不复存在了。

答案 1 :(得分:5)

我对with语句的理解是,无论如何,当您退出范围时,它会为您关闭文件句柄。如果您的程序在with块内退出,那么仍然会发生这种情况。

就其他变量而言,当程序自动退出时,它们将从内存中删除。如果您有兴趣找到在运行之间保持持久性的方法,可以查看pickle(http://docs.python.org/library/pickle.html)或shelve(http://docs.python.org/library/shelve.html)模块。就我个人而言,我更喜欢搁置去泡菜,但它们都很适合。

@gotgenes - 感谢您的建议。值得注意的是,shelve在其底层实现中使用了pickle。当我说我更喜欢搁置来腌制时,我的意思是,对于我目前使用搁架设计的持久性很重要的方式更容易,因为除了作为在运行之间持续存在的字典之外,它不会做任何其他事情。

答案 2 :(得分:2)

一旦程序终止释放内存,就永远不必将变量设置为NULL。对于文件也是如此 - 无论你是在with循环还是其他任何地方退出,它都会在内存中停留不少。但是,最好手动关闭文件,以便确保在退出程序之前执行任何挂起操作。一般来说,这应该发生,但特别是在写作时,我通常更喜欢近距离。