PermissionError: [WinError 32] с файлами fits

#python #python-3.x #shutil #astropy #fits

#python #python-3.x #shutil #астропия #подходит

Вопрос:

Я пытаюсь читать и перемещать 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/NOMEANBCDNAMEOFMYFILE
Traceback (most recent call last):

  File "C:Usersjdrevonanaconda3libshutil.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:UsersjdrevonDesktopTHESEModelingDATA_SORTINGuntitled0.py", line 76, in <module>
    V2_MATISSE,UV, UV_TP,TP_MATISSE,FLUX_MATISSE = OIFITS_READING(MATISSE_DIR)

  File "C:UsersjdrevonDesktopTHESEModelingDATA_SORTINGuntitled0.py", line 64, in OIFITS_READING
    shutil.move(filenames,MATISSE_DIR_LM '/')

  File "C:Usersjdrevonanaconda3libshutil.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 версию своего кода для открытия файла, но это ничего не изменило.

Комментарии:

1. Этот файл используется каким-либо другим процессом, возможно, каким-либо текстовым редактором или выполняется как служба. Закройте все оставшиеся приложения или перезагрузите компьютер и повторите попытку

2. Все еще не работает после перезагрузки компьютера :/

3. Очень странно, что без Visibility_2_fichier = fichier["OI_VIS2"].data["VIS2DATA"] рутинных работ и с этой строкой, которая начинает заполнять или работать с данными, этого не происходит.

4. Кроме того, я не понимаю таких строк, как if np.logical_and(FOLDER_FLAG_TRASH==False,FOLDER_FLAG_N==True) . Что не так с just if not FOLDER_FLAG_TRASH and FOLDER_FLAG_N: ?

5. Я просто говорю, что с логическими переменными их значение истинности неявно. Все, что вам нужно написать, это if X: или if X and Y: , или if X or not Y: и т. Д. Вам не нужно явно сравнивать их с True or False , а тем более использовать np.logical_and , что актуально только для операций с массивами в масштабе всего элемента.

Ответ №1:

Это предупреждение в документации должно ответить на ваш вопрос (возможно, предупреждение следует переместить в другое место, поскольку оно не относится только к «большим файлам»):

При открытии файла с memmap=True помощью, из-за того, как работает mmap, это означает, что при обращении к данным HDU (т.Е. hdul[0].data ) Другой дескриптор файла FITS открывается mmap. Это означает, что даже после вызова hdul.close() mmap все еще содержит открытый дескриптор данных, так что к нему все еще могут обращаться неосторожные программы, созданные с предположением, что атрибут .data содержит все данные в памяти.

Чтобы принудительно закрыть mmap, либо дождитесь, пока содержащий HDUList объект выйдет из области видимости, либо вызовите вручную del hdul[0].data . (Это работает до тех пор, пока нет других ссылок на массив данных.)

Комментарии:

1. Да, спасибо 🙂 Это была проблема. Ввод факта memmap = False решил проблему 🙂 ! Спасибо