Как скопировать файл с сетевого ресурса на локальный диск с переменными?

Если я использую следующую строку:

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)

Но у меня не было удачи с различными изменениями этого подхода.

11
задан Enamul Hassan 7 August 2016 в 07:51
поделиться

4 ответа

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)
23
ответ дан 3 December 2019 в 02:40
поделиться

Это выглядит как проблема сбежания - как говорит Балфа, 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
3
ответ дан 3 December 2019 в 02:40
поделиться

R R для «сырой строки», а не для относительного. Когда вы не префиксете свою строку с помощью R , Python будет лечить обратно « \ в качестве эвактора.

Итак, когда ваша строка содержит обратные SLASLash, вы либо должны поставить R , либо поставить две обратные косания для каждого, которую вы хотите появиться.

>>> r"\\myfile" == "\\\\myfile"
True
4
ответ дан 3 December 2019 в 02:40
поделиться

Из ваших примерных путей, ясно, что мы обсуждаем ОС . Реализация 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))
1
ответ дан 3 December 2019 в 02:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: