2010-08-04 46 views
3

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

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,程序中一般变量会发生什么变化?

+4

他们终于摆脱了压迫。 – relet 2010-08-04 16:20:14

+0

“文件是否保留在内存中”这怎么会发生?你的过程不再存在。 “记忆”在哪里停留?你在暗示什么? – 2010-08-04 17:11:45

+0

@ S.Lott:寒意。海报可能还没有遇到OS管理的流程的较低层次的概念。 – Santa 2010-08-04 17:46:36

回答

8

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

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

当您的进程终止时,您的变量将不复存在。

+0

进一步详细说明,当您启动一个Python“程序”时,操作系统会为该Python“程序”分配一个进程,由“python.exe”启动。这个过程为你的“变量”分配内存和文件描述符。当你“退出”程序时,该进程将被操作系统本身破坏 - 以及其分配的资源。 – Santa 2010-08-04 17:49:08

+0

也许,解释Python虚拟机的交互操作有点难,因为它涉及到人们自然而然地认为是他们的程序(即Python脚本)。 – 2010-08-04 18:05:49

2

只要你的程序终止内存被释放,你永远不需要设置变量为NULL。对于文件也是如此 - 无论是在with循环还是在其他地方退出,它都停留在内存中。但是,手动关闭文件是一种很好的做法,因此您可以确保在退出程序之前执行任何挂起的操作。总的来说,这应该发生,但特别是在写作时,我通常更喜欢关闭。

5

我对with声明的理解是,无论如何,当你退出它的范围时,它会为你关闭文件句柄。如果您的程序在with区块内退出,应该仍然会发生。

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

@gotgenes - 谢谢你的建议。需要注意的是,shelve在底层实现中使用pickle。当我说我更喜欢搁置腌菜时,我的意思是,对于我目前使用搁置设计的持久性很重要的方式更容易,因为它不仅仅是作为运行之间持续的字典。

+0

链接到pickle http://docs.python.org/library/pickle.html和搁置http://docs.python.org/library/shelve.html(请将它们添加到此答案并删除此评论)。 – gotgenes 2010-08-04 16:31:03

+2

我认为你应该注意,shelve使用pickle来进行对象序列化。根据您的偏好说明,它们不是两种不同的序列化方法。 – gotgenes 2010-08-04 16:33:04

相关问题