16

如果我使用以下行:

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

4 回答 4

28

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)
于 2010-01-11T14:22:14.740 回答
5

r是“原始字符串”,而不是相对的。当您不使用 为字符串添加前缀时r,Python 会将反斜杠 " \" 视为转义字符。

因此,当您的字符串包含反斜杠时,您要么必须在其前面放置一个r,要么为每个要出现的单个反斜杠放置两个反斜杠。

>>> r"\\myfile" == "\\\\myfile"
True
于 2010-01-11T14:20:06.773 回答
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
于 2010-01-11T14:21:46.457 回答
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 :\富。

import os
shutil.copyfile(os.path.join(source_path, file_name),
    os.path.join(dest_path, file_name))
于 2010-01-11T14:31:09.760 回答