astropy.io.ascii.write 不带引号的文件字符串

astropy.io.ascii.write string to file without quotes

我正在尝试使用以下方法将字符串和浮点数写入文件:

t=['SDSS J2000']
data=[10] 
astropy.io.ascii.write([t,data] ,'data.dat',names=['name','num'],formats={'name':'%s','num':'%f'})

输出文件是:

name num
"SDSS J2000" 10.000000

如何将不带引号的字符串写入文件,如下所示:

SDSS J2000 10.000000

您可以 split 使用 space 作为分隔符,您可以 split 再使用 " 作为分隔符。

例如(我没试过):

first = str.split(string, delimiter=' ')

如果显示结果:print first[0] 给出 "SDSS

然后:

second_1 = str.split(first[0], delimiter = '"')
second_2 = str.split(first[1], delimiter = '"')

您将获得 SDSS second_1[1]

那么你 return :

print second_1[1] + second_2[0] + first[2]

将给出:SDSS J2000 10.0000

正如我所说,这是一个例子,我没试过!但逻辑就在那里。 我认为它确实存在比我的更好的答案,但这是一种方法

您提供了 2 个数据和 2 个值,因此 astropy 引用数据以便能够读回。

真的需要astropy吗?标准 python 使用 str.format:

很容易做到
t=['SDSS J2000']
data=[10]
with open("data.txt","w") as f:
    f.write("{} {} {:f}".format(*(t[0].split()+data)))

如果你真的想要使用astropy实现,你可以使用quotechar设置为space(并使用选项来避免显示 header):

astropy.io.ascii.write([t,data] ,'data.dat',names=['name','num'],format='no_header',quotechar=' ',formats={'name':'%s','num':'%f'})

这里写道:

  SDSS  J2000  10.000000

太多 spaces,当你试图扭曲图书馆的手臂写入无法可靠地读回的数据时预期

编辑:另一种方法是让 astropy 写下它的引号然后删除它们,使用 io.StringIO 避免 writing/reading/writing 到磁盘:

import astropy.io.ascii
import io

t=['SDSS J2000']
data=[10]
buf=io.StringIO()
astropy.io.ascii.write([t,data] ,buf,names=['name','num'],format='no_header',formats={'name':'%s','num':'%f'})
with open("data.dat") as f:
    f.write(buf.getvalue().replace('"',""))

文件现在包含:

SDSS J2000 10.000000