У меня ниже сценарий 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)
косые черты не являются специальными символами, им действительно нужны необработанные строковые литералы? stackoverflow.com/questions/2081640/…. Обратные косые черты обязательно, но не косые черты, верно?
@ clearshot66 Я также пробовал включить r 'перед Bath_path, но безуспешно. base_path = r '/ Пользователи / пользователь / Рабочий стол /'
r'base_path / {} '- это необработанный строковый литерал, содержащий те же символы, которые вы использовали в качестве переменной base_path, но он не добавляет в строку ценитьbase_path
. Я не уверен, что должен означать .format(type)
, но я просто предполагаю, что последний фрагмент вашего примера кода не был точно скопирован в вопрос.
Я бы рекомендовал вам оставить все текущие проблемы рабочего каталога на усмотрение пользователя - если они хотят указать относительный путь, они могут войти в каталог, к которому он относится, перед вызовом 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
.
спасибо, я понял, где я все это время делал не так.
Если я правильно это понимаю, вы можете использовать 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))
вам нужен r в base_path, потому что косая черта