首页 > 解决方案 > 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我的代码版本来打开文件,但这并没有改变任何东西。

标签: pythonpython-3.xshutilastropyfits

解决方案


文档中的这个警告应该回答你的问题(也许应该把警告移到其他地方,因为它不仅仅针对“大文件”):

当使用 . 打开文件时memmap=True,由于 mmap 的工作方式,这意味着当访问 HDU 数据时(即hdul[0].data),另一个指向 FITS 文件的句柄由 mmap 打开。这意味着即使在调用hdul.close()mmap 之后仍然持有数据的打开句柄,因此它仍然可以被粗心的程序访问,这些程序是在假设 .data 属性具有内存中的所有数据的情况下构建的。

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


推荐阅读