Вызов относительных путей в Python

У меня ниже сценарий 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)

вам нужен r в base_path, потому что косая черта

clearshot66 25.10.2018 21:04

косые черты не являются специальными символами, им действительно нужны необработанные строковые литералы? stackoverflow.com/questions/2081640/…. Обратные косые черты обязательно, но не косые черты, верно?

Daniel Farrell 25.10.2018 21:05

@ clearshot66 Я также пробовал включить r 'перед Bath_path, но безуспешно. base_path = r '/ Пользователи / пользователь / Рабочий стол /'

Kevin Nash 25.10.2018 21:13

r'base_path / {} '- это необработанный строковый литерал, содержащий те же символы, которые вы использовали в качестве переменной base_path, но он не добавляет в строку ценитьbase_path. Я не уверен, что должен означать .format(type), но я просто предполагаю, что последний фрагмент вашего примера кода не был точно скопирован в вопрос.

Daniel Farrell 25.10.2018 21:18
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
205
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я бы рекомендовал вам оставить все текущие проблемы рабочего каталога на усмотрение пользователя - если они хотят указать относительный путь, они могут войти в каталог, к которому он относится, перед вызовом 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.

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

Kevin Nash 25.10.2018 21:21

Если я правильно это понимаю, вы можете использовать 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))

Другие вопросы по теме