Вызов относительных путей в Python - PullRequest
0 голосов
/ 25 октября 2018

Ниже приведен скрипт Python, который извлекает файл из одного местоположения и копирует его в другое целевое местоположение.Приведенный ниже код прекрасно работает, если я определяю пути с абсолютными местоположениями.

Я пытаюсь определить это, используя переменные, которые по завершении не выполняют скрипт.Выдается сообщение об ошибке, но код, похоже, не выполняется.

Код:

Path_from = r'/Users/user/Desktop/report'
Path_to = r'/Users/user/Desktop/report'

for root, dirs, files in os.walk((os.path.normpath(Path_from)), topdown=False):
        for name in files:
            if name.endswith('{}.txt'.format(date)):
                print
                "Found"
                SourceFolder = os.path.join(root, name)
                shutil.copy2(SourceFolder, Path_to)

Я хочу изменить код с

Path_from = r'/Users/user/Desktop/report'

до

base_path = /Users/user/Desktop/
Path_from = r'base_path/{}'.format(type)

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Если я правильно читаю, вы можете использовать pathlib, в частности код pathlib.Path будет выглядеть как

from pathlib import Path
import re
import shutil

path_from = Path("/") / "Users" / "user" / "Desktop" # Better IMO
# path_from = Path("/Users/user/Desktop")
path_to = Path("/") / "Users" / "user" / "OtherDesktop"

datename = "whatever"

for x in path_from.glob("*.txt"):
    if re.search(r"{}$".format(datename), x.stem): # stem is whatever is before the extension 
    # ex. something.txt -> something

        shutil.copy(str(path_from / x.name), str(path_to / x.name))
0 голосов
/ 25 октября 2018

Я бы порекомендовал вам оставить все текущие проблемы рабочего каталога пользователю - если они хотят указать относительный путь, они могут войти в каталог, к которому он относится, прежде чем вызывать python и предоставлять относительные пути.

Это то, что делают почти все инструменты и программы linux - они редко берут «базовый путь», а оставляют задачу предоставления допустимых путей относительно текущего каталога (или абсолютного) пользователю.

Если вы посвятили себя идее выбора другого параметра в качестве относительного пути, это должно быть довольно просто сделать.Ваш пример не имеет допустимого синтаксиса Python, но он близок:

$ cat t.py
from os.path import join
basepath="/tmp"
pathA = "fileA"
pathB = "fileB"
print(join(basepath,pathA))
print(join(basepath,pathB))

обратите внимание, однако, что это предотвращает предоставление абсолютного пути во время выполнения скрипта.

Вместо этого вы можете использовать формат:

basepath="/tmp"
pathA = "fileA"
pathB = "fileB"
print( "{}/{}".format(basepath, pathA) )
print( "{}/{}".format(basepath, pathB) )

Но тогда вы предполагаете, что знаете, как объединить пути в рассматриваемой операционной системе, поэтому существует os.path.join.

...