Como copiar um arquivo de um compartilhamento de rede para o disco local com variáveis?
-
19-09-2019 - |
Pergunta
Se eu usar a seguinte linha:
shutil.copyfile(r"\\mynetworkshare\myfile.txt","C:\TEMP\myfile.txt")
tudo funciona bem. No entanto, o que eu não consigo entender é como usar uma variável com o caminho de compartilhamento de rede, porque eu preciso a bandeira (relativo?) 'R'. O resultado final eu imagino seria algo como:
source_path = "\\mynetworkshare"
dest_path = "C:\TEMP"
file_name = "\\myfile.txt"
shutil.copyfile(r source_path + file_name,dest_path + file_name)
Mas eu não tive nenhuma sorte com diferentes variações desta abordagem.
Solução
O r
usado em seu primeiro exemplo de código está fazendo a seqüência de uma "matéria" string. Neste exemplo, isso significa que a corda vai ver as barras invertidas e não tentar usá-los para escapar \\
apenas \
.
Para obter o seu segundo trabalho exemplo de código, você pode usar o r
sobre as cordas, e não no 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)
Outras dicas
O r
é para "string crua", não para o parente. Quando você não prefixo sua seqüência com r
, Python irá tratar a barra invertida "\
" como um caractere de escape.
Assim, quando sua seqüência contém barras invertidas, você tem que colocar um r
antes, ou colocar duas barras invertidas para cada um que você quer que apareça.
>>> r"\\myfile" == "\\\\myfile"
True
Este parece ser um problema escapando - como balpha diz, o r
faz o personagem \
um literal, em vez de uma seqüência de controle. Você já tentou:
source_path = r"\\mynetworkshare"
dest_path = r"C:\TEMP"
filename = r"\my_file.txt"
shutil.copyfile(source_path + filename, dest_path + filename)
(Usando uma sessão python interativo, você pode ver o seguinte:
>>> 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
com seu exemplo caminhos, é claro que estamos discutindo a Windows OS
.
implementação de Python sobre esta utilização OS uma biblioteca de tempo de execução comum (C
) que aceita barras como equivalente a barras invertidas. Desta forma, você pode evitar problemas de char de fuga.
source_path = "//mynetworkshare"
dest_path = "C:/TEMP"
file_name = "/myfile.txt"
Note que a composição filename é tratado por os.path. juntar :
Junte-se a um ou mais componentes de caminho de forma inteligente. Se qualquer componente é um caminho absoluto, todos os componentes anteriores (no Windows, incluindo a letra da unidade anterior, se havia uma) são jogados fora, e juntando continua. O valor de retorno é a concatenação de Caminho1, e opcionalmente cami2, etc, com exactamente um separador de directório (os.sep) inserido entre os componentes, a menos que cami2 está vazia. Note que no Windows, uma vez que existe um diretório atual para cada unidade, os.path.join ( "c:", "foo") representa um caminho relativo para o diretório atual na unidade C: (c: foo), não c :. \ foo
import os
shutil.copyfile(os.path.join(source_path, file_name),
os.path.join(dest_path, file_name))