[WinError 32]该进程无法访问文件,因为该文件正在被另一个进程使用:

时间:2018-07-06 15:12:39

标签: windows python-3.x file-io astropy fits

我有要写入文件的代码,并且在代码成功运行后下一次运行代码时,出现以下错误:

  

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”处。如果还有其他方法可以写入文件或使用新数据更新现有文件,请告诉我。谢谢

1 个答案:

答案 0 :(得分:0)

this comment所述,在Windows上文件I / O的工作方式是,如果已经在另一个进程中打开了该文件,则无法覆盖该文件。您是否正在编写此文件并在另一个程序中打开它?如果您在其他程序中打开了该文件,则无法覆盖它。

在另一个程序中打开文件时,是否需要能够就地更新文件?如果是这样,仍然有可能,但是您不能使用HDUList.writeto(),因为那样会有效地删除现有文件并将其替换为新文件(而不是就地更新现有文件)。

此外,您如何运行此代码?是在脚本中吗?您提到每次都必须更改文件名,但是您可以设计一些不必要的东西。我注意到您的代码中已硬编码了文件名,如果要编写功能更广泛的脚本,可以并且应该将其固定。例如,您可以接受文件名作为命令行参数。您还可以让脚本在文件名后附加数字或如果文件已经存在的话。

所有这些,您应该弄清楚为什么要在多个程序中打开同一文件。

除了一个小用法:

您的示例中的new_hdu.close()实际上没有任何作用。 HDUList.close()方法仅在您从磁盘打开现有FITS文件时才有意义。在这里,您将在内存中创建一个HDUList(表示FITS文件的数据结构),并调用高级HDUList.writeto(),这会打开一个文件,将内存中的数据写入该文件,然后关闭文件。因此,.close()在这种情况下是无操作的。我猜想也许您添加了它是为了解决您的问题,但这实际上并不重要。