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

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

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)

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


person Blake Blackwell    schedule 11.01.2010    source источник


Ответы (4)


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)
person Rudd Zwolinski    schedule 11.01.2010
comment
Кроме того, я бы рекомендовал взглянуть на библиотеку os.path. Затем вы можете заменить file_name = "\\myfile.txt" на file_name = "myfile.txt" и shutil.copyfile(source_path + file_name, dest_path + file_name) на shutil.copyfile(os.path.join(source_path, file_name), os.path.join(dest_path, file_name)), что будет работать на разных платформах. - person Mike DeSimone; 11.01.2010
comment
Спасибо, это было как раз то, что я искал. - person Blake Blackwell; 11.01.2010
comment
Подумать только, что все это время я думал, что это означает регулярное выражение - спасибо! - person Ross; 09.04.2013

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

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

>>> r"\\myfile" == "\\\\myfile"
True
person balpha    schedule 11.01.2010

Это похоже на проблему экранирования - как говорит balpha, 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
person Chowlett    schedule 11.01.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 :\фу.

import os
shutil.copyfile(os.path.join(source_path, file_name),
    os.path.join(dest_path, file_name))
person gimel    schedule 11.01.2010