我在带有标题的ascii文件中有一个数据表,我想将我的ascii表转换为带标题的拟合文件
#ID ra dec x y Umag Bmag Vmag Rmag Imag
1.0 53.146 -27.8123 3422.98 3823.58 24.4528 24.7995 23.6266 22.64 20.8437
2.0 53.1064 -27.801 3953.49 3994.62 23.3284 22.6716 22.1762 21.6189 21.2141
3.0 53.1322 -27.7829 3608.34 4269.29 21.2676 20.1937 19.6743 19.0707 18.6983
4.0 53.1017 -27.8022 4017.09 3975.24 23.6987 22.84 21.9946 21.0781 19.8616
5.0 53.118 -27.8021 3798.98 3978.42 23.3087 22.1932 21.2205 20.1842 18.6448
6.0 53.1479 -27.8239 3397.92 3648.27 25.0347 24.598 23.7259 22.9945 21.9228
7.0 53.1334 -27.7758 3592.51 4375.76 21.5159 20.4777 19.6065 18.6609 17.188
8.0 53.1048 -27.8259 3974.47 3617.5 22.3266 22.3517 22.0677 21.7664 21.6781
9.0 53.1249 -27.8109 3706.47 3843.89 24.0539 23.3009 22.4001 21.4732 20.1244
10.0 53.1207 -27.7822 3763.3 4278.76 24.417 23.7635 22.9405 22.1379 21.5564
11.0 53.0886 -27.7611 4193.25 4596.77 22.012 22.3081 22.125 21.9488 21.9071
12.0 53.1272 -27.7498 3676.7 4768.82 19.3631 19.7458 19.5979 19.4438 19.4002
任何想法如何设法用python做到这一点? 欢呼声。
答案 0 :(得分:6)
我找到了解决自己问题的方法: 将文件作为数组读取
import pyfits
from scipy.io import *
M=read_array(filename)
将每列专用于标题名称
c1=pyfits.Column(name='ID', format='E', array=M[:,0])
c2=pyfits.Column(name='RA', format='E', array=M[:,1])
c3=pyfits.Column(name='DEC', format='E', array=M[:,2])
c4=pyfits.Column(name='X', format='E', array=M[:,3])
c5=pyfits.Column(name='Y', format='E', array=M[:,4])
c6=pyfits.Column(name='Umag', format='E', array=M[:,5])
c7=pyfits.Column(name='Bmag', format='E', array=M[:,6])
c8=pyfits.Column(name='Vmag', format='E', array=M[:,7])
c9=pyfits.Column(name='Rmag', format='E', array=M[:,8])
c10=pyfits.Column(name='Imag', format='E', array=M[:,9])
cols = pyfits.ColDefs([c1, c2, c3, c4, c5, c6, c7, c8, c9, c10])
将标题和列写为拟合文件:
tbhdu = pyfits.new_table(cols)
hdu = pyfits.PrimaryHDU(data=M)
thdulist = pyfits.HDUList([hdu,tbhdu])
thdulist.writeto(outfilename)
thdulist.close()
有效!!
答案 1 :(得分:1)
将ASCII文件转换为FITS文件可以更简单,更省时的方式完成。 人们可以利用这个:
from astropy.io import ascii
test_input = '../Data/test.txt'
text_file = ascii.read(test_input)
text_file.write('text_to_fits.fits')
如果未提供绝对路径,将在当前工作目录中创建FITS文件。
必需的安装:( Astropy Library)
pip install --no-deps astropy
您可以在以下链接中查看其他基本要求。例如,numpy。 如果不存在,他们会与上述声明一起下载。所以不用担心。
链接到Astropy网站:http://docs.astropy.org/en/stable/install.html
创建FITS文件后,可以按如下方式打开它:
import astropy.table as at
fits_file = '../Data/text_to_fits.fits'
table = at.Table.read(fits_file)
为了操作和使用FITS文件,您可以尝试使用Astropy。 最初是为天文学相关数据集的主要目的而写的,其中FITS文件非常常用,对于其他应用程序来说,它是一个非常有用的库。
文档:http://docs.astropy.org/en/stable/index.html
从输入到输出:
输入ASCII文件:
col1 col2 col3
1234 2345 3456
输出FITS文件:
Out[10]:
<Table length=1>
col1 col2 col3
int64 int64 int64
----- ----- -----
1 2 3
希望这有帮助!
答案 2 :(得分:0)
即使问题是关于如何通过Python实现它,一个更容易的方法是使用Topcat(目录和表上的操作工具)。
该软件的网站可在THIS LINK HERE
中找到Topcat允许您加载几乎所有格式(ASCII,FITS,FITS +,CSV等)。 加载表后,在这种情况下为ASCII表,您可以将其保存为FITS文件,就像将.pptx文档保存到.pdf文档一样!保存为FITS文件后,可以打开FITS文件,手动输入列标题!
这非常快速且有用,并且可以立即绘制列而无需编写任何代码。
答案 3 :(得分:0)
它具有允许使用自定义标头的灵活性,并保留ascii表中提供的相同列名(无需明确输入)。
def table2fits(tab, header=None):
'''
takes the data from an ascii.table.Table and outputs
a pyfits.hdu.table.BinTableHDU, creating a blank
header if no header is provided
'''
from astropy.io import fits
if header is None:
prihdr = fits.Header()
prihdu = fits.PrimaryHDU(header=prihdr)
else:
prihdu = fits.PrimaryHDU(header=header)
table_hdu = fits.BinTableHDU.from_columns(np.array(tab.filled()))
return fits.HDUList([prihdu, table_hdu])
用法是
from astropy.io import ascii
myasciitable = asii.read("/path/to/input.file")
myfitstable = table2fits(myasciitable)
myfitstable.writeto("/path/to/output.fits", clobber=True)