问题描述
我正在尝试使用此代码和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
。 (只要没有对数据数组的其他引用,此方法就起作用。)