PermissionError:[WinError 32]用于创建文件

问题描述

有一个代码段如下

try:
    f = h5py.File(filename,'w-')
except: 
    os.remove(filename)
    f = h5py.File(filename,'w-')  

运行程序,获取与上述代码段相关的错误。我认为是因为文件未关闭。谷歌搜索类似的错误消息,似乎可以解决using "with" statement,但是我不确定如何修改上述代码段。

OSError                                   Traceback (most recent call last)
<ipython-input-19-1f1f9c5eb3dd> in vid_to_hdf(En,start,end,chunk)
      9     try:
---> 10         f = h5py.File(filename,'w-')
     11     except:

~\AppData\Local\Continuum\anaconda3\envs\fastai-py37\lib\site-packages\h5py\_hl\files.py in __init__(self,name,mode,driver,libver,userblock_size,swmr,rdcc_nslots,rdcc_nbytes,rdcc_w0,track_order,**kwds)
    407                                fapl,fcpl=make_fcpl(track_order=track_order),--> 408                                swmr=swmr)
    409 

~\AppData\Local\Continuum\anaconda3\envs\fastai-py37\lib\site-packages\h5py\_hl\files.py in make_fid(name,fapl,fcpl,swmr)
    176     elif mode in ['w-','x']:
--> 177         fid = h5f.create(name,h5f.ACC_EXCL,fapl=fapl,fcpl=fcpl)
    178     elif mode == 'w':

h5py\_objects.pyx in h5py._objects.with_phil.wrapper()

h5py\_objects.pyx in h5py._objects.with_phil.wrapper()

h5py\h5f.pyx in h5py.h5f.create()

OSError: Unable to create file (file exists)

During handling of the above exception,another exception occurred:

PermissionError                           Traceback (most recent call last)
<timed eval> in <module>

<ipython-input-19-1f1f9c5eb3dd> in vid_to_hdf(En,chunk)
     10         f = h5py.File(filename,'w-')
     11     except:
---> 12         os.remove(filename)
     13         f = h5py.File(filename,'w-')
     14     # Create dataset within file

PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'E23.hdf5'

解决方法

请注意,共享代码示例中还不清楚:

try:
    f = h5py.File(filename,'w-')
except: 
    os.remove(filename)
    f = h5py.File(filename,'w-')  # <- why the error handling code is repeating exactly as the code that just failed to run?

打开系统资源(如文件)时,会存在有关所存储资源的信息/状态,应将其作为程序的纯净行为而释放/关闭(例如,关闭操作系统的文件句柄)。

所以在Python中

my_file = open('myfile.txt','r')  # getting the resource
my_file.readlines()  # using the resources
my_file.close()  # closing the file,releasing system resources

为简化此操作,某些API提供了context manager块,可在with块中使用:

with open('myfile.txt','r') as my_file:
   my_file.readlines()

# after the with block,the context manager automatically calls close() when exiting the runtime context

h5py provides这样的API,因此h5py.File实例也可以在with块中使用:

with h5py.File(filename,'w-') as f:
    pass # do your processing with f

# now after the block,the file is closed

请注意,关闭文件并不意味着将其删除。因此,在代码中关闭文件并释放系统资源之后,该文件将保留在磁盘上,直到被删除。但是在很多情况下,这是预期的行为,因为文件是程序的结果。

如果要确保始终删除文件,可以使用try/finally块,但是请注意,程序运行后,磁盘上将没有文件剩余:

try:
   with f = h5py.File(filename,'w-'):
       pass # use the file resource
finally:
   if os.path.exists(filename):
       os.remove(filename)
,

首先,请先删除文件,然后再使用。
如果不能这样做,请尝试读取文件的内容,删除File对象,删除文件,然后写入文件。

如果这不起作用,请尝试以下操作:

with h5py.File(filename,'w-') as f:
    # This is where you put what you're going to do with f
# At the end of the with statement,the object gets deleted.
try:
    os.remove(filename)
except:
    pass

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...