Автоматизировать выбор файлов с помощью Python - PullRequest
0 голосов
/ 25 апреля 2018

Я кодирую интерфейс с Tkinter и хочу автоматизировать задачу.Фактическая функция открывает окно, которое позволяет пользователю выбирать файлы (я указываю тип файлов. Затем пути этих файлов извлекаются из других функций для изменения файлов. Вот моя фактическая функция:

def get_path():  #return the path of the selected file(s)

    root = Tk()
    i= datetime.datetime.now()
    day = i.day
    month=i.month
    root.filename =  filedialog.askopenfilenames(initialdir = "Z:\SGI\SYNCBBG",title = "Select your files",filetypes = (("Fichier 1","f6365full_account_refresh*"+str(month)+str(day)+".1"),("Fichier 1","f6365icsh*"+str(month)+str(day)+".1"),("all files",".*")))
    root.withdraw()
    return (root.filename)

То, что я хочу, это просто иметь функцию, которая автоматически извлекает все файлы типа (который я указываю) в двух разных каталогах. Я сделал это, и код запускается и печатает результат, но после этого Python перестает отвечать на запросы и тамЭто ошибка, поэтому я должен закрыть Python. Другое дело, что я получаю имя файла, а не абсолютный путь, но это не главная проблема:

def path_L2():

    os.chdir("Z:/SGI/SYNCBBG/L2/results/results")
    for file in glob.glob("f6365full_account_refresh*"+str(month)+str(day)+".1"):
        return file
    for file in glob.glob("f6365icsh*"+str(month)+str(day)+".1"):
        return file

def path_L3():

    os.chdir("Z:/SGI/SYNCBBG/L3/results/results")
    for file in glob.glob("f6365full_account_refresh*"+str(month)+str(day)+".1"):
        return file
    for file in glob.glob("f6365icsh*"+str(month)+str(day)+".1"):
        return file

paths=path_L2()
print(paths)

1 Ответ

0 голосов
/ 25 апреля 2018

return немедленно вернется из функции.В вашем случае вы возвращаете первый результат вашего первого оператора glob в каждой функции, а затем выходите из функции.

Все, что вы хотите сделать, это взять списки, возвращенные из glob, и добавитьих вместе.Вы хотите что-то вроде:

def path_L2():
    os.chdir("Z:/SGI/SYNCBBG/L2/results/results")
    return glob.glob("f6365full_account_refresh*"+str(month)+str(day)+".1") + glob.glob("f6365icsh*"+str(month)+str(day)+".1")

def path_L3():
    os.chdir("Z:/SGI/SYNCBBG/L3/results/results")
    return glob.glob("f6365full_account_refresh*"+str(month)+str(day)+".1") + glob("f6365icsh*"+str(month)+str(day)+".1")

Я бы не стал использовать os.chdir - это активно меняет ваш рабочий каталог.Кроме того, поскольку ваши две функции эквивалентны, за исключением одной строки, вы должны создать одну функцию, которая выполняет всю эту работу.(Смысл использования функций заключается в том, чтобы не повторять один и тот же код снова и снова.) Я бы сделал следующее.(Я добавил некоторые дополнительные переменные ради аккуратности.)

def path_L(l_dir):
    path1 = "f6365full_account_refresh*"+str(month)+str(day)+".1"
    path2 = "f6365icsh*"+str(month)+str(day)+".1"
    glob_expr1 = os.path.join(l_dir, path1)
    glob_expr2 = os.path.join(l_dir, path2)

    return glob.glob(glob_expr1) + glob.glob(glob_expr2)

Затем вы можете позвонить path_L, чтобы получить L2 с:

l2_paths = path_L("Z:/SGI/SYNCBBG/L2/results/results")
l3_paths = path_L("Z:/SGI/SYNCBBG/L3/results/results")
...