ディスクリスト上のファイルを開くいくつかのオブジェクトを保持し、プログラムの完了後にそれらのファイルを削除する必要があるプログラムがあります。ただし、ファイルを開く必要があるオブジェクトへの参照がなくなったにもかかわらず、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
ここで提示したファイルの抽象化された問題に関する問題を修正するため、ミリムースの回答を以下の正しいものとしてマークしました。残念ながら、私が使用していた GDAL オブジェクトでは機能しませんでした。今後の参考のために、私は深く掘り下げgdal.Dataset.__destroy_swig__(ds)
て、少なくともデータセットが関連付けられているファイルを閉じるように見える文書化されていない関数を見つけました。データセットに関連付けられたディスク上のファイルを削除する前に、最初にそれを呼び出しますが、それはうまくいくようです。