Comment copier un fichier à partir d'un partage réseau sur le disque local avec des variables?

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

Question

Si j'utilise la ligne suivante:

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

tout fonctionne bien. Cependant, ce que je ne peux pas à comprendre comment utiliser une variable du chemin de partage réseau, parce que je dois le « r » de drapeau (par rapport?). Le résultat final, j'imagine serait quelque chose comme:

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

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

Mais je n'ai pas eu de chance avec différentes variantes de cette approche.

Était-ce utile?

La solution

Le r utilisé dans votre premier exemple de code fait la chaîne une chaîne « brute ». Dans cet exemple, cela signifie que la chaîne va voir les antislashs et ne pas essayer de les utiliser pour échapper \\ juste \.

Pour votre deuxième travail exemple de code, vous devez utiliser les r sur les cordes, et non dans la commande copyfile:

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

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

Autres conseils

Le r est pour « chaîne brute », et non pour le parent. Lorsque vous ne préfixe pas votre chaîne avec r, Python traitera la barre oblique inverse « \ » comme caractère d'échappement.

Ainsi, lorsque votre chaîne contient des barres obliques inverses, vous devez soit mettre r avant, ou mettre deux barres obliques pour chacun unique que vous souhaitez apparaître.

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

Cela ressemble à une question échappe - comme dit balpha, le r fait le caractère \ un littéral, plutôt que d'une séquence de contrôle. Avez-vous essayé:

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

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

(à l'aide d'une session interactive de python, vous pouvez voir les éléments suivants:

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

A partir de vos chemins par exemple, il est clair que nous discutons de la Windows OS. la mise en œuvre de Python sur ce système d'exploitation utilise une bibliothèque d'exécution (C) commun qui accepte les barres obliques avant comme équivalent à l'arrière-barres obliques. De cette façon, vous pouvez éviter les problèmes escape char.

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

Notez que la composition de nom de fichier est géré par os.path. rejoindre :

  

Joignez-vous à un ou plusieurs composants de chemin intelligemment. Si un composant est un chemin absolu, tous les composants précédents (sous Windows, y compris la lettre de lecteur précédente, s'il y avait un) sont jetés et rejoindre continue. La valeur de retour est la concaténation des path1, et éventuellement path2, etc., avec exactement un séparateur d'annuaire (os.sep) inséré entre les composants, sauf path2 est vide. Notez que sous Windows, car il y a un répertoire courant pour chaque lecteur, os.path.join ( « c: », « toto ») représente un chemin par rapport au répertoire courant sur le lecteur C: (c: foo), non c :. \ foo

import os
shutil.copyfile(os.path.join(source_path, file_name),
    os.path.join(dest_path, file_name))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top