PermissionError:[WinError 32]与适合的文件

问题描述

我正在尝试使用此代码和FITS软件包将shutil文件从一个文件夹读取和移动到另一个文件夹:

    MATISSE_DIR_N     = MATISSE_DIR+'N'  
    MATISSE_DIR_LM    = MATISSE_DIR+'LM'
    MATISSE_DIR_TRASH = MATISSE_DIR+'TRASH' 
    
        
    for filenames in glob.glob(MATISSE_DIR+'*.fits'):

        print(filenames)
        FOLDER_FLAG_LM    = False 
        FOLDER_FLAG_N     = False
        FOLDER_FLAG_TRASH = False
        
        if 'IR-N' in filenames:
            FOLDER_FLAG_N = True
        elif 'IR-LM' in filenames:
            FOLDER_FLAG_LM = True

        
        fichier = fits.open(filenames)    
        
        
        # VISIBILITY
        
#        Visibility_2_fichier = fichier["OI_VIS2"].data["VIS2DATA"]


        fichier.close()

        if np.logical_and(FOLDER_FLAG_TRASH==False,FOLDER_FLAG_N==True):
            shutil.move(filenames,MATISSE_DIR_N+'/')
        
        elif np.logical_and(FOLDER_FLAG_TRASH==False,FOLDER_FLAG_LM==True):
            shutil.move(filenames,MATISSE_DIR_LM+'/')
            
        elif FOLDER_FLAG_TRASH == True :
            shutil.move(filenames,MATISSE_DIR_TRASH+'/')

这很好用,但是当我取消注释行时:

        Visibility_2_fichier = fichier["OI_VIS2"].data["VIS2DATA"]

这不再起作用,并出现以下错误:

runfile('C:/Users/jdrevon/Desktop/THESE/Modeling/DATA_SORTING/untitled0.py',wdir='C:/Users/jdrevon/Desktop/THESE/Modeling/DATA_SORTING')
C:/Users/jdrevon/Desktop/THESE/DATA/DATA_RSCL_test/NOMEANBCD\NAMEOFMYFILE
Traceback (most recent call last):

  File "C:\Users\jdrevon\anaconda3\lib\shutil.py",line 788,in move
    os.rename(src,real_dst)

PermissionError: [WinError 32] Le processus ne peut pas accéder au fichier car ce fichier est utilisé par un autre processus: 'C:/Users/jdrevon/Desktop/THESE/DATA/DATA_RSCL_test/NOMEANBCD\\NAMEOFMYFILE' -> 'C:/Users/jdrevon/Desktop/THESE/DATA/DATA_RSCL_test/NOMEANBCD/LM/NAMEOFMYFILE'


During handling of the above exception,another exception occurred:

Traceback (most recent call last):

  File "C:\Users\jdrevon\Desktop\THESE\Modeling\DATA_SORTING\untitled0.py",line 76,in <module>
    V2_MATISSE,UV,UV_TP,TP_MATISSE,FLUX_MATISSE = OIFITS_READING(MATISSE_DIR)

  File "C:\Users\jdrevon\Desktop\THESE\Modeling\DATA_SORTING\untitled0.py",line 64,in OIFITS_READING
    shutil.move(filenames,MATISSE_DIR_LM+'/')

  File "C:\Users\jdrevon\anaconda3\lib\shutil.py",line 803,in move
    os.unlink(src)

PermissionError: [WinError 32] Le processus ne peut pas accéder au fichier car ce fichier est utilisé par un autre processus: 'C:/Users/jdrevon/Desktop/THESE/DATA/DATA_RSCL_test/NOMEANBCD\\NAMEOFMYFILE'

我不明白为什么当您开始存储来自数据文件的数据时,fichier.close()命令不再足以关闭文件。我已经尝试过我的代码的with版本来打开文件,但这没有任何改变。

解决方法

This warning in the documentation应该回答您的问题(也许警告应该移到其他地方,因为它不仅限于“大文件”):

使用memmap=True打开文件时,由于mmap的工作原理,这意味着当访问HDU数据(即hdul[0].data)时,mmap将打开FITS文件的另一个句柄。这意味着,即使在调用hdul.close()之后,mmap仍会保留数据的打开句柄,因此仍可以通过假定.data属性将所有数据存储在内存中的粗心程序访问它

为了强制关闭mmap,请等待包含的HDUList对象超出范围,或者手动调用del hdul[0].data。 (只要没有对数据数组的其他引用,此方法就起作用。)

相关问答

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