Come copiare un file da una condivisione di rete sul disco locale con le variabili?
-
19-09-2019 - |
Domanda
Se uso la seguente riga:
shutil.copyfile(r"\\mynetworkshare\myfile.txt","C:\TEMP\myfile.txt")
tutto funziona bene. Tuttavia, quello che non riesco a capire è come usare una variabile con il percorso di condivisione di rete, perché ho bisogno di (relativa?) Flag 'r'. Il risultato finale mi immagino sarebbe qualcosa di simile:
source_path = "\\mynetworkshare"
dest_path = "C:\TEMP"
file_name = "\\myfile.txt"
shutil.copyfile(r source_path + file_name,dest_path + file_name)
Ma ho avuto fortuna con diverse varianti di questo approccio.
Soluzione
Il r
utilizzato nel primo esempio di codice sta facendo la stringa una stringa "raw". In questo esempio, questo significa che la stringa vedrà i backslash e non tenta di utilizzare loro di fuggire \\
a poco \
.
Per ottenere il secondo esempio di codice di lavoro, utilizza il r
sulle corde, e non nel 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)
Altri suggerimenti
Il r
è per "stringa di prima", non per il parente. Quando non si prefisso la stringa con r
, Python tratterà il backslash "\
" come carattere di escape.
Così, quando la stringa contiene backslash, hai per porre r
prima di esso, o mettere due barre rovesciate per ogni singolo uno che si desidera visualizzare.
>>> r"\\myfile" == "\\\\myfile"
True
Questo appare come un problema in fuga - come balpha dice, il r
rende il personaggio \
letterale, piuttosto che una sequenza di controllo. Hai provato:
source_path = r"\\mynetworkshare"
dest_path = r"C:\TEMP"
filename = r"\my_file.txt"
shutil.copyfile(source_path + filename, dest_path + filename)
(utilizzando una sessione interattiva di Python, è possibile visualizzare il seguente:
>>> 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
Da tuoi sentieri esempio, è chiaro che stiamo discutendo il Windows OS
.
implementazione di Python su questo sistema operativo usa una libreria comune (C
) runtime che accetta le barre equivalenti a-barre rovesciate. In questo modo è possibile evitare problemi di char di fuga.
source_path = "//mynetworkshare"
dest_path = "C:/TEMP"
file_name = "/myfile.txt"
Si noti che il nome del file composizione è gestita da os.path. unire :
far parte di uno o più componenti del percorso in modo intelligente. Se un componente è un percorso assoluto, tutti i componenti precedenti (in Windows, tra cui la lettera di unità precedente, se ci fosse uno) vengono gettati via, e la giunzione continua. Il valore di ritorno è la concatenazione di path1 e path2 opzionalmente, ecc, con esattamente un separatore di directory (os.sep) inserito tra i componenti, salvo path2 è vuoto. Si noti che su Windows, poiché non v'è una directory corrente per ogni unità, os.path.join ( "c:", "foo") rappresenta un percorso relativo alla directory corrente sull'unità C: (c: foo), non c :. \ foo
import os
shutil.copyfile(os.path.join(source_path, file_name),
os.path.join(dest_path, file_name))