2010-01-11 3 views
10

Если я использую следующую строку:Как скопировать файл из сетевого ресурса на локальный диск с переменными?

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) 

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

ответ

15

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) 
+5

Кроме того, я бы рекомендовал смотреть на 'os.path' библиотеки. Затем вы можете заменить 'file_name =" \\ myfile.txt "' на 'file_name =" myfile.txt "и' shutil.copyfile (source_path + имя_файла, dest_path + имя_файла) 'с' shutil.copyfile (os.path.join (source_path, имя_файла), os.path.join (dest_path, имя_файла)) ', что Работает кросс-платформенная. –

+0

Спасибо, это было именно то, что я искал. –

+0

Думать, что все это время я думал, что это означает регулярное выражение - спасибо! – Ross

4

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

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

>>> r"\\myfile" == "\\\\myfile" 
True 
3

Это выглядит как краешек вопрос - как говорит 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 
1

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

source_path = "//mynetworkshare" 
dest_path = "C:/TEMP" 
file_name = "/myfile.txt" 

Обратите внимание, что состав файла обрабатывается os.path.join:

Регистрация один или несколько компонентов пути разумно. Если какой-либо компонент является абсолютным путем, все предыдущие компоненты (в Windows, включая предыдущую букву диска, если они есть), удаляются, а соединение продолжается. Возвращаемое значение представляет собой конкатенацию пути 1 и, необязательно, путь2 и т. Д., Причем ровно один разделитель каталога (os.sep) вставлен между компонентами, если путь2 пуст. Обратите внимание, что в 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)) 

 Смежные вопросы

  • Нет связанных вопросов^_^