Я пытаюсь написать скрипт на python, чтобы облегчить мою работу. Мне нужно использовать os.system для вызова некоторых функций из внешнего программного обеспечения.

Есть ли способ вставить цикл for внутри этой строки, без необходимости каждый раз писать obs_dir[n] ??

import os
obs_dir = ['18185','18186','18187','19926','19987','19994','19995','20045','20046','20081']
xid = ['src21']
i=0

os.system("pset combine_spectra src_arfs=/"
          + obs_dir[0] + "/" + xid[i] + "_" + obs_dir[0] + "_spectrum.arf,"
          + "/" + obs_dir[1] + "/" + xid[i] + "_" + obs_dir[1] + "_spectrum.arf,"
          + "/" + obs_dir[2] + "/" + xid[i] + "_" + obs_dir[2] + "_spectrum.arf,"
          + "/" + obs_dir[3] + "/" + xid[i] + "_" + obs_dir[3] + "_spectrum.arf,"
          + "/" + obs_dir[4] + "/" + xid[i] + "_" + obs_dir[4] + "_spectrum.arf,"
          + "/" + obs_dir[5] + "/" + xid[i] + "_" + obs_dir[5] + "_spectrum.arf,"
          + "/" + obs_dir[6] + "/" + xid[i] + "_" + obs_dir[6] + "_spectrum.arf,"
          + "/" + obs_dir[7] + "/" + xid[i] + "_" + obs_dir[7] + "_spectrum.arf,"
          + "/" + obs_dir[8] + "/" + xid[i] + "_" + obs_dir[8] + "_spectrum.arf,"
          + "/" + obs_dir[9] + "/" + xid[i] + "_" + obs_dir[9] + "_spectrum.arf")
0
Alessandro Peca 23 Фев 2018 в 14:01

4 ответа

Лучший ответ

Вы можете создать требуемую команду, сначала выполнив итерации по списку (obs_dir) и сформировав строку.

< Сильный > Пример:

import os
obs_dir = ['18185','18186','18187','19926','19987','19994','19995','20045','20046','20081']
xid = ['src21']


s = "pset combine_spectra src_arfs="
for i in obs_dir:
    s += "/{0}/{1}_{0}_spectrum.arf, ".format(i, xid[0])

s = s.strip().rstrip(',')
print s
#os.system(s)
3
Rakesh 23 Фев 2018 в 11:12

Я думаю, что это может быть то, что вы хотите

import os
obs_dir = ['18185','18186','18187','19926','19987','19994','19995','20045','20046','20081']
xid = ['src21']

str_cmd = "pset combine_spectra src_arfs=" + obs_dir[0]
separator = ""
for dir in obs_dir
  str_cmd + =  separator + "/" + dir + "/" + xid[i] + "_" + dir + "_spectrum.arf"
  separator = ","
  
os.system(str_cmd)
2
Lareb Khalil Syed 23 Фев 2018 в 11:08

У вас есть xid[i], но нет i, поэтому вы используете xid[0],

"/{}/{}_{}_spectrum.arf".format(obs_dir[1],xid[0],obs_dir[1])

Дает

'/18186/src21_18186_spectrum.arf'

Итак, format помогает. Кроме того, join поможет объединить их в строку через запятую:

",".join(['a', 'b'])

Дает

'a,b'

Соединив это вместе, вы получите

s = ",".join(["/{}/{}_{}_spectrum.arf".format(o,xid[0],o) for o in obs_dir])

Давая параметры, которые вы хотите

'/18185/src21_18185_spectrum.arf,/18186/src21_18186_spectrum.arf,/18187/src21_18g187_spectrum.arf,/19926/src21_19926_spectrum.arf,/19987/src21_19987_spectrum.arfg,/19994/src21_19994_spectrum.arf,/19995/src21_19995_spectrum.arf,/20045/src21_20g045_spectrum.arf,/20046/src21_20046_spectrum.arf,/20081/src21_20081_spectrum.arfg'

Без запасного ',' в конце.

Тогда используйте это

os.system("pset combine_spectra src_arfs=" + s)
2
doctorlove 23 Фев 2018 в 11:18

Не в строке, но мы можем построить строку, используя такие функции, как понимание списка (в данном случае выражение генератора) и объединение строк:

obs_dir = ['18185','18186','18187','19926','19987','19994','19995','20045','20046','20081']
xid = ['src21']
i = 0

print("pset combine_spectra src_arfs=" +
    ",".join("/{0}/{1}_{0}_spectrum.arf".format(n,xid[i])
             for n in obs_dir))
1
Yann Vernier 23 Фев 2018 в 11:16