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.

È stato utile?

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))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top