How to copy a file from a network share to local disk with variables?

我只是一个虾纸丫 提交于 2020-01-12 01:55:53

问题


If I use the following line:

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

everything works fine. However, what I can't seem to figure out is how to use a variable with the network share path, because I need the 'r' (relative?) flag. The end result I would imagine would be something like:

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

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

But I have had no luck with different variations of this approach.


回答1:


The r used in your first code example is making the string a "raw" string. In this example, that means the string will see the backslashes and not try to use them to escape \\ to just \.

To get your second code sample working, you'd use the r on the strings, and not in the copyfile command:

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

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



回答2:


The r is for "raw string", not for relative. When you don't prefix your string with r, Python will treat the backslash "\" as an escape character.

So when your string contains backslashes, you either have to put an r before it, or put two backslashes for each single one you want to appear.

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



回答3:


This looks like an escaping issue - as balpha says, the r makes the \ character a literal, rather than a control sequence. Have you tried:

source_path = r"\\mynetworkshare"
dest_path = r"C:\TEMP"
filename = r"\my_file.txt"

shutil.copyfile(source_path + filename, dest_path + filename)

(Using an interactive python session, you can see the following:

>>> 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:


From your example paths, it's clear that we are discussing the Windows OS. Python implementation on this OS use a common (C) runtime library that accepts forward slashes as equivalent to back-slashes. This way you can avoid escape char issues.

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

Note that filename composition is handled by os.path.join:

Join one or more path components intelligently. If any component is an absolute path, all previous components (on Windows, including the previous drive letter, if there was one) are thrown away, and joining continues. The return value is the concatenation of path1, and optionally path2, etc., with exactly one directory separator (os.sep) inserted between components, unless path2 is empty. Note that on Windows, since there is a current directory for each drive, os.path.join("c:", "foo") represents a path relative to the current directory on drive C: (c:foo), not c:\foo.

import os
shutil.copyfile(os.path.join(source_path, file_name),
    os.path.join(dest_path, file_name))


来源:https://stackoverflow.com/questions/2042342/how-to-copy-a-file-from-a-network-share-to-local-disk-with-variables

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!