2010-01-11 17 views
10

Si utilizo la siguiente línea:¿Cómo copiar un archivo desde un recurso compartido de red al disco local con variables?

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

todo funciona bien. Sin embargo, lo que no puedo entender es cómo usar una variable con la ruta compartida de red, porque necesito el indicador 'r' (¿relativo?). El resultado final me imagino sería algo así como:

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

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

Pero no he tenido suerte con diferentes variaciones de este enfoque.

Respuesta

15

El r utilizado en su primer ejemplo de código está haciendo la cadena de una cadena "en bruto" En este ejemplo, eso significa que la cadena va a ver las barras invertidas y no tratar de utilizarlos para escapar a \\ simplemente \.

para obtener su segundo ejemplo de código de trabajo, tendrá que utilizar la r en el cuerdas, y no en el comando copyfile:

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

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

Además, te recomiendo mirar el 'biblioteca os.path'. Entonces podrías reemplazar 'file_name =" \\ myfile.txt "' con 'file_name =" miarchivo.txt "' y 'shutil.copyfile (source_path + file_name, dest_path + file_name)' con 'shutil.copyfile (os.path.join (source_path, file_name), os.path.join (dest_path, file_name))', que haría trabajo multiplataforma. –

+0

Gracias, esto era justo lo que estaba buscando. –

+0

Pensar que todo este tiempo he estado pensando que significaba una expresión regular, ¡gracias! – Ross

4

La r es para "cadena sin procesar", no para pariente. Cuando no prefija su cadena con r, Python tratará la barra invertida "\" como un carácter de escape.

Así que cuando su cadena contiene barras invertidas, o bien debe poner una r antes, o poner dos barras invertidas para cada uno que desee que aparezca.

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

Esto se ve como un problema de escapar - como dice balpha, la r hace que el personaje \ un literal, en lugar de una secuencia de control. ¿Has probado:

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

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

(Usando una sesión de Python interactiva, se puede ver lo siguiente:.

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

de su ejemplo caminos, está claro que estamos hablando de la Windows OS. La implementación de Python en este sistema operativo usa una biblioteca de tiempo de ejecución común (C) que acepta barras inclinadas como equivalentes a barras diagonales inversas. De esta forma puede evitar problemas de escape de char.

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

Tenga en cuenta que la composición de nombre de archivo es manejado por os.path.join:

unirse a uno o más componentes de la ruta de forma inteligente. Si algún componente es una ruta absoluta, todos los componentes anteriores (en Windows, incluida la letra de la unidad anterior, si hubiera una) se descartan y la unión continúa. El valor de retorno es la concatenación de path1, y opcionalmente path2, etc., con exactamente un separador de directorio (os.sep) insertado entre componentes, a menos que path2 esté vacío. Tenga en cuenta que en Windows, dado que hay un directorio actual para cada unidad, os.path.join ("c:", "foo") representa una ruta relativa al directorio actual en la unidad C: (c: foo), no c : \ foo.

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