【问题标题】:How to copy a file from a network share to local disk with variables?如何使用变量将文件从网络共享复制到本地磁盘?
【发布时间】:2011-01-03 18:45:52
【问题描述】:

如果我使用以下行:

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)

但我对这种方法的不同变体没有运气。

【问题讨论】:

    标签: python network-programming share


    【解决方案1】:

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

    【讨论】:

    • 另外,我建议查看os.path 库。然后你可以用file_name = "myfile.txt"替换file_name = "\\myfile.txt",用shutil.copyfile(os.path.join(source_path, file_name), os.path.join(dest_path, file_name))替换shutil.copyfile(source_path + file_name, dest_path + file_name),这样可以跨平台工作。
    • 谢谢,这正是我想要的。
    • 一直以来我一直认为它表示正则表达式 - 谢谢!
    【解决方案2】:

    r 用于“原始字符串”,而不是相对的。当你没有在字符串前面加上r 时,Python 会将反斜杠“\”视为转义字符。

    因此,当您的字符串包含反斜杠时,您要么必须在其前面放置一个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
      

      【讨论】:

        【解决方案4】:

        从您的示例路径中,很明显我们正在讨论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))
        

        【讨论】:

          猜你喜欢
          • 2020-12-08
          • 1970-01-01
          • 1970-01-01
          • 2014-08-29
          • 1970-01-01
          • 1970-01-01
          • 2016-09-06
          • 2010-09-07
          • 1970-01-01
          相关资源
          最近更新 更多