Как мне найти выходной файл скрипта python os, если я не знаю его имени - PullRequest
0 голосов
/ 16 марта 2020

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

Тогда у меня вопрос, как я могу сослаться на файл, который был только что выведен в результате выполнения команды os?

вот мой код, если это поможет

# each row is for one patient
for row in range(2):
    #for each id, find descriptors
    local_id=df.loc[row,'# localid']
    age=str(df.loc[row,'Age'])
    if df.loc[row,'gender']=='Female':
        gender='F'
    else: gender='M'
    indication=df.loc[row,'indication']
    race=df.loc[row,'race']

    #run loop to run until matching generated patient has matching race and indication
    check=True
    while check:
        if indication=='Breast carcinoma':
            os.system('run_synthea -p 1 -a '+age+' -g '+gender+' -m breast_cancer')
        elif indication=='Hyperlipidemia':
            os.system('run_synthea -p 1 -a '+age+' -g '+gender+' -m veteran_hyperlipidemia')
        elif indication=='Colorectal Cancer / Polyps':
            os.system('run_synthea -p 1 -a '+age+' -g '+gender+' -m colorectal_cancer')
        else: #runs for , not selected, healthy, ovarian cancer, and heart diseases
            os.system('run_synthea -p 1 -a '+age+' -g '+gender)

        # INSET CODE , find output file 
        output_file=''
        has_indication=check_indication(output_file, indication)
        has_race=json.load(output_file)['entry'][0]['resource']['extension'][0]['extension'][1]['valueString']
        if has_indication and has_race==race:
            deID=output_file['entry'][0]['resource']['id']
            thewriter.writerow([local_id,deID])
            check=False

1 Ответ

1 голос
/ 16 марта 2020

Предполагая, что вы знаете каталог, в котором будут находиться новые файлы, вы можете сделать снимок каталога до и после. Это fr agile, поскольку предполагается, что больше ничего не трогает каталог во время выполнения команды.

import os

target_dir = "." # assume current working directory

before_list = set(os.listdir(target_dir))
os.system(...)
new_files = set(os.listdir(target_dir)) - before_list

Лучше создать каталог специально для задачи

import tempfile
import subprocess as subp
import os

with tempfile.TemporaryDirectory(prefix="synthea_", dir=".") as prog_dir:
    result = qsubp.run(
        'run_synthea -p 1 -a '+age+' -g '+gender+' -m breast_cancer',
        shell=True, cwd=prog_dir)
    out_files = [fn for fn in os.listdir(prog_dir)
        if os.path.isfile(os.path.join(prog_dir, fn))]
    # move files out of temp dir before it is deleted
    for fn in out_files:
        os.rename(os.path.join(prog_dir, fn), fn))

Сейчас out_files содержит список файлов, созданных и перемещенных в текущий каталог.

...