#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)
. Что не так с justif not FOLDER_FLAG_TRASH and FOLDER_FLAG_N:
?5. Я просто говорю, что с логическими переменными их значение истинности неявно. Все, что вам нужно написать, это
if X:
илиif X and Y:
, илиif X or not Y:
и т. Д. Вам не нужно явно сравнивать их сTrue
orFalse
, а тем более использовать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 решил проблему 🙂 ! Спасибо