我有一个程序,我需要在磁盘列表中保留一些打开文件的对象,并在程序完成后删除这些文件。然而,即使没有更多对应该打开文件的对象的引用,Python 似乎也保持文件打开。我已经能够用下面的纯文件对象重新创建问题:
import os
filenames = ['a.txt', 'b.txt']
files = [open(f,'w') for f in filenames]
for f_object in files:
f_object.write("test")
del files[:]
for name in filenames:
os.remove(name)
当我在 Windows 上运行它时,我得到了错误
Traceback (most recent call last):
File ".\file_del.py", line 11, in <module>
os.remove(name)
WindowsError: [Error 32] The process cannot access the file because it is being used by another process: 'b.txt'
有趣的是它可以a.txt
毫无问题地删除。b.txt
即使对它的引用消失了,是什么导致文件打开?
更新
在最初的问题中,我无权访问文件来关闭它们。相信我,我很想关闭这些文件。请参阅以下内容:
base_uri = 'dem'
out_uri = 'foo.tif'
new_raster_from_base_uri(base_uri, out_uri, 'GTiff', -1, gdal.GDT_Float32)
ds = []
for filename in [out_uri]:
ds.append(gdal.Open(filename, gdal.GA_Update))
band_list = [dataset.GetRasterBand(1) for dataset in ds]
for band in band_list:
for row_index in xrange(band.YSize):
a = numpy.zeros((1, band.XSize))
band.WriteArray(a, 0, row_index)
for index in range(len(ds)):
band_list[index] = None
ds[index] = None
del ds[:]
os.remove(out_uri)
更新 2
我已将millimoose 的答案标记为下面的正确答案,因为它解决了我在此处介绍的文件抽象问题的问题。不幸的是,它不适用于我正在使用的 GDAL 对象。为了将来参考,我深入挖掘并发现了gdal.Dataset.__destroy_swig__(ds)
似乎至少关闭了与数据集关联的文件的未记录函数。在删除与数据集关联的磁盘上的文件之前,我首先调用它,这似乎有效。