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

StackOverflow https://stackoverflow.com/questions/2042342

Вопрос

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

shutil.copyfile(r"\\mynetworkshare\myfile.txt","C:\TEMP\myfile.txt")

все работает нормально.Однако, чего я, похоже, не могу понять, так это как использовать переменную с общим сетевым ресурсом path, потому что мне нужен 'r' (относительный?) Отметить.Конечный результат, который я бы себе представил, был бы чем-то вроде:

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

shutil.copyfile(r source_path + file_name,dest_path + file_name)

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

Это было полезно?

Решение

Тот самый 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)

Другие советы

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

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

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

Это похоже на ускользающую проблему - как говорит Балфа, 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

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

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))
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top