Как скопировать файл с сетевого ресурса на локальный диск с переменными? - PullRequest
11 голосов
/ 11 января 2010

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

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)

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

Ответы [ 4 ]

22 голосов
/ 11 января 2010

r, используемый в вашем первом примере кода, делает строку «необработанной» строкой. В этом примере это означает, что строка будет видеть обратную косую черту и не будет пытаться использовать их для перехода от \\ к \.

Чтобы ваш второй пример кода работал, вы должны использовать 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)
4 голосов
/ 11 января 2010

r для «необработанной строки», а не для относительной. Если вы не префикс вашей строки с r, Python будет обрабатывать обратную косую черту "\" как escape-символ.

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

>>> r"\\myfile" == "\\\\myfile"
True
3 голосов
/ 11 января 2010

Это выглядит как выход из проблемы - как говорит Бальфа, 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
1 голос
/ 11 января 2010

Из ваших примеров путей ясно, что мы обсуждаем Windows OS. Реализация Python в этой ОС использует общую (C) библиотеку времени выполнения, которая принимает прямую косую черту как эквивалент обратной косой черты. Таким образом, вы можете избежать проблем с escape-символами.

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))
...