我有要写入文件的代码,并且在代码成功运行后下一次运行代码时,出现以下错误:
PermissionError:[WinError 32]该进程无法访问文件,因为该文件正在被另一个进程使用:'minicube_HE022222.fits'
因此,每一次我都必须更改fits文件的名称,然后没有错误。每次运行代码时都必须更改文件名,实在令人沮丧。这是我的代码段:
new_hdu = fits.HDUList([fits.PrimaryHDU(mini_data), fits.ImageHDU(mini_error)])
new_hdu[0].header = qso_header
new_hdu.writeto('minicube_HE022222.fits',overwrite=True)
new_hdu.close()
我在以下位置收到错误:
new_hdu.writeto('minicube_HE022222.fits',overwrite=True)
我在写入文件后关闭了文件,但这也无济于事。 任何建议表示赞赏。
更新:
这是发生此错误的代码的另一部分:
hdus=[]
hdus.append(fits.PrimaryHDU())
hdus.append(fits.ImageHDU(par[0,:,:],name='amp_Hb'))
hdus.append(fits.ImageHDU(par[1,:,:],name='amp_OIII5007'))
hdus.append(fits.ImageHDU(par[2,:,:],name='amp_OIII5007_br'))
hdus.append(fits.ImageHDU(par[3,:,:],name='amp_Hb_br'))
hdus.append(fits.ImageHDU(par[4,:,:],name='amp_Hb1'))
hdus.append(fits.ImageHDU(par[5,:,:],name='amp_Hb2'))
hdus.append(fits.ImageHDU(par[6,:,:],name='amp_Fe5018_1'))
hdus.append(fits.ImageHDU(par[7,:,:],name='amp_Fe5018_2'))
hdus.append(fits.ImageHDU(par[8,:,:],name='m'))
hdus.append(fits.ImageHDU(par[9,:,:],name='c'))
hdu = fits.HDUList(hdus)
hdu.writeto('subcube_par_HE12_lsq.fits',overwrite=True)
仅在发生错误的“ xxx.writeto”处。如果还有其他方法可以写入文件或使用新数据更新现有文件,请告诉我。谢谢
答案 0 :(得分:0)
如this comment所述,在Windows上文件I / O的工作方式是,如果已经在另一个进程中打开了该文件,则无法覆盖该文件。您是否正在编写此文件并在另一个程序中打开它?如果您在其他程序中打开了该文件,则无法覆盖它。
在另一个程序中打开文件时,是否需要能够就地更新文件?如果是这样,仍然有可能,但是您不能使用HDUList.writeto()
,因为那样会有效地删除现有文件并将其替换为新文件(而不是就地更新现有文件)。
此外,您如何运行此代码?是在脚本中吗?您提到每次都必须更改文件名,但是您可以设计一些不必要的东西。我注意到您的代码中已硬编码了文件名,如果要编写功能更广泛的脚本,可以并且应该将其固定。例如,您可以接受文件名作为命令行参数。您还可以让脚本在文件名后附加数字或如果文件已经存在的话。
所有这些,您应该弄清楚为什么要在多个程序中打开同一文件。
除了一个小用法:
您的示例中的new_hdu.close()
实际上没有任何作用。 HDUList.close()
方法仅在您从磁盘打开现有FITS文件时才有意义。在这里,您将在内存中创建一个HDUList
(表示FITS文件的数据结构),并调用高级HDUList.writeto()
,这会打开一个文件,将内存中的数据写入该文件,然后关闭文件。因此,.close()
在这种情况下是无操作的。我猜想也许您添加了它是为了解决您的问题,但这实际上并不重要。