-1

我已经编写了一段从 python 运行 sextractor 的代码,但是我只知道如何为一个文件执行此操作,并且我需要在 62 个文件上循环它。我不知道我会怎么做。我在下面附上了我的代码:

#!/usr/bin/env python

# build a catalog using sextractor on des image here

sys.path.append('/home/fitsfiles')     #not sure if this does anything/is correct

def sex(image, output, sexdir='/home/sextractor-2.5.0', check_img=None,config=None, l=None) : 
  '''Construct a sextractor command and run it.'''
  #creates a sextractor line e.g sex img.fits -catalog_name -checkimage_name
  q="/home/fitsfiles/"+ "01" +".fits"
  com = [ "sex ", q, " -CATALOG_NAME " + output]
  s0=''
  com = s0.join(com)
  res = os.system(com)
  return res

img_name=sys.argv[0]
output=img_name[0:1]+'_star_catalog.fits'
t=sex(img_name,output)

print '----done !---'

所以这段代码在我的主终端中生成一个命令,性别 /home/fitsfiles/01.fits -CATALOG_NAME g_star_catalog.fits

它成功地生成了我想要的星表。

但是,我希望我的代码适用于 62 个 fit 文件,并根据使用的 fitfile 更改 star_catalog.fits 的名称。任何帮助,将不胜感激。

4

2 回答 2

1

有很多方法可以解决这个问题。假设您想像这样运行脚本

python extract_stars.py /home/fitsfiles/*.fits

然后,你可以尝试这样的事情:

for arg in len(sys.argv):
    filename = arg.split('/')[-1].strip('.fits')
    t = sex(arg, filename +'_star_catalog.fits')
    # Whatever else

这假设您删除了sex重新格式化输入文件名的行。此外,您不需要将 fit 目录附加到您的路径中。

另一种方法是,如果你不打算在 python 中做任何其他事情,你可以编写一个 bash 脚本来真正简化任务。

而且,作为旁注,如果您更一般地提出了这个问题(即,我希望将我编写的函数应用到许多输入文件)并且不参考一个相当不常用的应用程序,您可能会收到一个更快地回答。

于 2013-05-24T02:34:36.553 回答
1

社区现在已经开发了一些 python 包装器,允许您像运行 python 命令一样运行 sextractor。它们是:pysex、sewpy 和 astromatic_wrapper。

sextractor 包装器的好处在于,它允许您编写更简洁的代码,而无需定义额外的函数、调用 os 命令或在您的机器上拥有配置文件和输出文件。此外,输出可以是 astropy 表、pandas 数据框或 numpy 数组。

对于您的具体情况,您可以使用pysex并执行以下操作:

import pysex
import glob

filelist = glob.glob('/directory/*.fits')

for fitsfile in filelist:
    cat = pysex.run(fitsfile, params=['X_IMAGE', 'Y_IMAGE', 'FLUX_APER'],
    conf_args={'PHOT_APERTURES':5})
    print cat['FLUX_APER']  
于 2016-01-11T07:09:02.957 回答