J'ai regardé dans l' os
interface Python , mais je n'ai pas pu trouver de méthode pour déplacer un fichier. Comment pourrais-je faire l'équivalent de $ mv ...
Python?
>>> source_files = '/PATH/TO/FOLDER/*'
>>> destination_folder = 'PATH/TO/FOLDER'
>>> # equivalent of $ mv source_files destination_folder
python
file
file-handling
David542
la source
la source
mv
de commande , de pythonshutil.move
a un cas de bord où lashutil.move
fonction diffère. Allez ici pour un compte rendu complet . En un mot, Pythonshutil.move
lèvera une exception (mais pas gnu-coreutilsmv
) lorsque votre destination est un répertoire et que le répertoire a déjà un fichier avec le même nom que la source (encore une fois pour plus d'informations, voir le lien fourni dans la phrase précédente ).os.system("mv file1 file2")
?Réponses:
os.rename()
,,shutil.move()
ouos.replace()
Tous utilisent la même syntaxe:
Notez que vous devez inclure le nom de fichier (
file.foo
) dans les arguments source et destination. S'il est modifié, le fichier sera renommé et déplacé.Notez également que dans les deux premiers cas, le répertoire dans lequel le nouveau fichier est créé doit déjà exister. Sous Windows, un fichier portant ce nom ne doit pas exister ou une exception sera déclenchée, mais
os.replace()
remplacera silencieusement un fichier même dans cette occurrence.Comme cela a été noté dans les commentaires sur d'autres réponses, il
shutil.move
suffit d'appeleros.rename
dans la plupart des cas. Cependant, si la destination se trouve sur un disque différent de la source, elle copiera puis supprimera le fichier source.la source
shutil.move
fonctionne pour les répertoires. Vous pouvez utiliser un chemin relatifshutil.move(f.name, "tmp/")
ou un chemin completshutil.move(f.name, "/Users/hello/tmp/")
, ne pas utiliser~
dans le chemin, vérifié dans python2.7.9, Mac OS X.~
est une construction shell, et n'a rien à voir avec les chemins de fichiers en soi, sauf comme une convention mal placée. Si vous voulez vraiment impliquer votre répertoire personnel, utilisez-le à laos.getenv('HOME')
place, en le concaténant avec des parties du chemin souhaité, si nécessaire.os.path.expanduser()
pour développer correctement le '~
' selon les règles spécifiques au système d'exploitation. Beaucoup plus soigné car il%HOME%
n'est pas toujours installé sur Windows.os.rename
ne traitera pas les fichiers sur différents appareils. À utilisershutil.move
si vous n'êtes pas sûr que la source et le fichier de destination se trouvent sur le même appareil.Bien
os.rename()
queshutil.move()
les deux renomment les fichiers, la commande la plus proche de la commande mv Unix estshutil.move()
. La différence est queos.rename()
cela ne fonctionne pas si la source et la destination se trouvent sur des disques différents,shutil.move()
sans se soucier du disque sur lequel se trouvent les fichiers.la source
shutil.move()
utiliseos.rename()
si la destination se trouve sur le système de fichiers actuel. Sinon,shutil.move()
copie la source vers la destination à l'aideshutil.copy2()
, puis supprime la source.shutil.copy2()
vous ne pouvez pas copier toutes les métadonnées de fichier , donc si cela se produit, c'est comme fairecp -p
et ensuiterm
, je comprends.Pour os.rename ou shutil.move, vous devrez importer le module. Aucun caractère * n'est nécessaire pour déplacer tous les fichiers.
Nous avons un dossier dans / opt / awesome appelé source avec un fichier nommé awesome.txt.
Nous avons utilisé os.listdir pour voir que le nom du dossier a en fait changé. Voici la fermeture de la destination vers la source.
Cette fois, j'ai vérifié dans le dossier source pour m'assurer que le fichier awesome.txt que j'ai créé existe. C'est là :)
Nous avons maintenant déplacé un dossier et ses fichiers d'une source vers une destination et vice-versa.
la source
Après Python 3.4, vous pouvez également utiliser
pathlib
la classe dePath
pour déplacer le fichier.https://docs.python.org/3.4/library/pathlib.html#pathlib.Path.rename
la source
Voici ce que j'utilise en ce moment:
Maintenant entièrement fonctionnel. J'espère que cela vous aidera.
Éditer:
J'ai transformé cela en une fonction, qui accepte un répertoire source et de destination, créant le dossier de destination s'il n'existe pas, et déplace les fichiers. Permet également le filtrage des fichiers src, par exemple si vous ne souhaitez déplacer que des images, alors vous utilisez le motif
'*.jpg'
, par défaut, il déplace tout dans le répertoirela source
os.path.join(parent_path, filename)
au lieu de la concaténation de chaînes pour éviter les problèmes multiplates-formesLa réponse acceptée n'est pas la bonne, car la question n'est pas de renommer un fichier en fichier, mais de déplacer de nombreux fichiers dans un répertoire.
shutil.move
fera le travail, mais à cet effetos.rename
est inutile (comme indiqué dans les commentaires) car la destination doit avoir un nom de fichier explicite.la source
os.path.basename(my_file_path)
et les répertoires de fichiers avecos.path.dirname(my_file_path)
. De plus, le PO n'a pas précisé clairement s'il souhaitait déplacer plusieurs fichiers. Il a mentionné le déplacement d'un seul fichier dans la question, mais son exemple de code impliquait le déplacement de plusieurs fichiers.Sur la base de la réponse décrite ici , l'utilisation
subprocess
est une autre option.Quelque chose comme ça:
Je suis curieux de connaître les avantages et les inconvénients de cette méthode par rapport à
shutil
. Étant donné que dans mon cas, j'utilise déjàsubprocess
pour d'autres raisons et que cela semble fonctionner, je suis enclin à m'en tenir à cela.Cela dépend-il du système peut-être?
la source
mv
être utilisé avec succès sur un système d'exploitation Windows.C'est une solution qui ne permet pas d'
shell
utilisermv
.la source
disque différent ex. C: -> D:
la source
f"{new_path}{f}"
mais étant donné que vous n'avez pas de texte statique dans votre chaîne, cela peut être plus de travail .... J'ai essayé de prendre l'habitude d'utiliser f-strings cependant.