Создание списка в python с использованием os.popen - PullRequest
4 голосов
/ 07 января 2020

Ранее мне удавалось создавать списки с помощью команды, подобной следующей:

os.popen('ls *.fits > samplelist')

Теперь я пытаюсь упорядочить файлы в списки, сгруппировав их по номер.

Файлы имеют следующие имена:

Name_0000_J.fits, Name_0001_J.fits, Name_0002_J.fits, т. д.

У меня есть попытался запустить эту строку кода, но он просто создает список skylist_J_1 и оставляет его пустым.

os.popen('for num in {0000..0089} ; do ls Name_$num\_J.fits >> skylist_J_1 ; done')

Я запустил вышеуказанное в командной строке, и он работает отлично. Любое понимание будет с благодарностью.

Редактировать:

Я придумала это решение, но оно довольно громоздкое. Надеюсь, есть более чистый способ сделать это sh.

def MkSkylist(qmin,qmax,name,band,quadrant):

    a = qmax-qmin+1

    ran = np.arange(qmin,qmax+1)
    num = [0]*a

    i = 0
    while i < a:
        num[i] = np.array2string(ran[i]).zfill(4)
        i = i + 1    

    os.popen('ls '+name+num[0]+'_'+band+'.fits > skylist_'+band+'_'+quadrant)

    i = 1
    while i < a:
        os.popen('ls '+name+num[0]+'_'+band+'.fits >> skylist_'+band+'_'+quadrant)
        i = i + 1

1 Ответ

1 голос
/ 07 января 2020

Кажется, проблема в синтаксисе for для l oop: хотя этот синтаксис действителен в bash, кажется, Python не нравится. Даже с subprocess.Popen(..., shell=True).

Итак, попробуйте использовать seq вместо:

os.popen("for num in $(seq 0 89); do printf "Name_%04dJ.fits\n" $num >> skylist_J_1; done");

, который генерирует файл skylist_J_1 с таким содержанием:

Name_0001J.fits
Name_0002J.fits
Name_0003J.fits
Name_0004J.fits
...
Name_0086J.fits
Name_0087J.fits
Name_0088J.fits
Name_0089J.fits

Также обратите внимание, что вы можете поместить перенаправление файлов снаружи, что больше похоже на ваш первый пример (с использованием > вместо >>):

os.popen('for num in $(seq 0 89); do printf "Name_%04dJ.fits\n" $num; done > skylist_J_1')
...