Como copiar um arquivo de um compartilhamento de rede para o disco local com variáveis?

StackOverflow https://stackoverflow.com/questions/2042342

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.

Foi útil?

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))
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top