如何使用变量将文件从网络共享复制到本地磁盘?

时间:2010-01-11 14:16:59

标签: python network-programming share

如果我使用以下行:

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 个答案:

答案 0 :(得分:22)

第一个代码示例中使用的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)

答案 1 :(得分:4)

r用于“原始字符串”,而不是用于相对。如果不在字符串前加r前缀,Python会将反斜杠“\”视为转义字符。

因此,当您的字符串包含反斜杠时,您必须在其前面放置r,或者为要显示的每个字符串添加两个反斜杠。

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

答案 2 :(得分: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

答案 3 :(得分:1)

从您的示例路径中,很明显我们正在讨论Windows OS。 此操作系统上的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))