Если я использую следующую строку:
shutil.copyfile(r"\\mynetworkshare\myfile.txt","C:\TEMP\myfile.txt")
все хорошо работает. Однако то, что я, может казаться, не выясняю, - то, как использовать переменную с путем сетевого ресурса, потому что мне нужен 'r' (родственник?) флаг. Конечный результат, который я вообразил бы, будет чем-то как:
source_path = "\\mynetworkshare"
dest_path = "C:\TEMP"
file_name = "\\myfile.txt"
shutil.copyfile(r source_path + file_name,dest_path + file_name)
Но у меня не было удачи с различными изменениями этого подхода.
R
, используемый в вашем примере первого кода, создает строку «RAW» строки. В этом примере это означает, что строка увидит обратные косания и не пытаться использовать их, чтобы сбежать \\
, чтобы просто \
.
Чтобы получить ваш второй код образца работы, вы используете R
на строках, а не в команде CopyFile
:
source_path = r"\\mynetworkshare"
dest_path = r"C:\TEMP"
file_name = "\\myfile.txt"
shutil.copyfile(source_path + file_name, dest_path + file_name)
Это выглядит как проблема сбежания - как говорит Балфа, R
производит символ \
литерал, а не последовательность управления. Вы пробовали:
source_path = r"\\mynetworkshare"
dest_path = r"C:\TEMP"
filename = r"\my_file.txt"
shutil.copyfile(source_path + filename, dest_path + filename)
(используя интерактивный сеанс Python, вы можете увидеть следующее:
>>> source_path = r"\\mynetworkshare"
>>> dest_path = r"C:\TEMP"
>>> filename = r"\my_file.txt"
>>> print (source_path + filename)
\\mynetworkshare\my_file.txt
>>> print (dest_path + filename)
C:\TEMP\my_file.txt
R
R для «сырой строки», а не для относительного. Когда вы не префиксете свою строку с помощью R
, Python будет лечить обратно « \
в качестве эвактора.
Итак, когда ваша строка содержит обратные SLASLash, вы либо должны поставить R
, либо поставить две обратные косания для каждого, которую вы хотите появиться.
>>> r"\\myfile" == "\\\\myfile"
True
Из ваших примерных путей, ясно, что мы обсуждаем ОС
.
Реализация Python в этой ОС использует общий ( C
) библиотеку времени выполнения, которая принимает пересылки, как эквивалентно обратно-скольжениям. Таким образом, вы можете избежать проблем с побегами.
source_path = "//mynetworkshare"
dest_path = "C:/TEMP"
file_name = "/myfile.txt"
Обратите внимание, что состав имени файла обрабатывается os.Path.join :
Присоединяйтесь к одному или нескольким компонентам пути разумно. Если какой-либо компонент является абсолютным путем, все предыдущие компоненты (в Windows, включая предыдущую букву диска, если было один), выброшены, и соединение продолжается. Возвращаемое значение - это конконация PATH1, и, необязательно, PATH2 и т. Д., Именно один разделитель каталогов (OS.SEP) вставлен между компонентами, если Path2 не пуст. Обратите внимание, что в Windows, поскольку есть текущий каталог для каждого диска, OS.Path.join («C:», «FOO») представляет собой путь относительно текущего каталога на диске C: (C: FOO), а не C : \ foo.
import os
shutil.copyfile(os.path.join(source_path, file_name),
os.path.join(dest_path, file_name))