我正在打开一个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
时,程序内部的变量会发生什么变化?
答案 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循环还是其他任何地方退出,它都会在内存中停留不少。但是,最好手动关闭文件,以便确保在退出程序之前执行任何挂起操作。一般来说,这应该发生,但特别是在写作时,我通常更喜欢近距离。