Comment déplacer un fichier en Python
j'ai regardé dans l'interface Python os
, mais j'ai été incapable de trouver une méthode pour déplacer un fichier. Comment faire l'équivalent de $ mv ...
en Python?
>>> source_files = '/PATH/TO/FOLDER/*'
>>> destination_folder = 'PATH/TO/FOLDER'
>>> # equivalent of $ mv source_files destination_folder
9 réponses
utilisent la même syntaxe:
import os
import shutil
os.rename("path/to/current/file.foo", "path/to/new/destination/for/file.foo")
shutil.move("path/to/current/file.foo", "path/to/new/destination/for/file.foo")
notez que dans les deux cas, le répertoire dans lequel le nouveau fichier est créé doit déjà exister (mais, sous Windows, un fichier de ce nom ne doit pas exister ou une exception sera soulevée). Notez aussi que vous devez inclure le nom du fichier ( file.foo
) dans les arguments source et destination. Si c'est modifié, le fichier sera renommé ainsi que déplacé.
comme il a été noté dans les commentaires sur d'autres réponses, shutil.move
appelle simplement os.rename
dans la plupart des cas. Cependant, si la destination est sur un disque différent de celui de la source, elle copiera et supprimera le fichier source.
bien que os.rename()
et shutil.move()
vont tous deux renommer les fichiers, la commande la plus proche de la commande Unix mv est shutil.move()
. La différence est que os.rename()
ne fonctionne pas si la source et la destination sont sur des disques différents, tandis que shutil.move()
ne se soucie pas du disque sur lequel les fichiers sont.
pour l'un ou l'autre os.renommer ou shutil.déplacer, vous devrez importer le module. Aucun caractère * n'est nécessaire pour déplacer tous les fichiers.
nous avons un dossier à /opt/awesome appelé source avec un fichier nommé awesome.txt.
in /opt/awesome
○ → ls
source
○ → ls source
awesome.txt
python
>>> source = '/opt/awesome/source'
>>> destination = '/opt/awesome/destination'
>>> import os
>>> os.rename(source, destination)
>>> os.listdir('/opt/awesome')
['destination']
nous avons utilisé os.listdir pour voir que le nom du dossier a effectivement changé. Voici le shutil qui ramène la destination à la source.
>>> import shutil
>>> shutil.move(destination, source)
>>> os.listdir('/opt/awesome/source')
['awesome.txt']
cette fois j'ai vérifié à l'intérieur du dossier source pour être sûr de l'impressionnant.le fichier txt que j'ai créé existe. Ca y est :)
maintenant nous avons déplacé un dossier et ses fichiers d'une source à une destination et retour.
la réponse acceptée n'est pas la bonne, parce que la question n'est pas de renommer un fichier dans un fichier, mais de déplacer de nombreux fichiers dans un répertoire. shutil.move
fera le travail, mais à cette fin os.rename
est inutile (comme indiqué sur les commentaires) parce que destination doit avoir un nom de fichier explicite.
c'est Ce que j'utilise en ce moment:
import os, shutil
path = "/volume1/Users/Transfer/"
moveto = "/volume1/Users/Drive_Transfer/"
files = os.listdir(path)
files.sort()
for f in files:
src = path+f
dst = moveto+f
shutil.move(src,dst)
est maintenant entièrement fonctionnel. Espérons que cela vous aide.
après Python 3.4, vous pouvez également utiliser la classe pathlib
's Path
pour déplacer le fichier.
Path("path/to/current/file.foo").rename("path/to/new/destination/for/file.foo")
https://docs.python.org/3.4/library/pathlib.html#pathlib.Path.rename
C'est la solution, qui ne permet pas shell
en utilisant mv
.
import subprocess
source = 'pathToCurrent/file.foo'
destination = 'pathToNew/file.foo'
p = subprocess.Popen(['mv', source, destination], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
res = p.communicate()[0].decode('utf-8').strip()
if p.returncode:
print('ERROR: ' + res)
import os,shutil
current_path = "" ## source path
new_path = "" ## destination path
os.chdir(current_path)
for files in os.listdir():
os.rename(files, new_path+'{}'.format(f))
shutil.move(files, new_path+'{}'.format(f)) ## to move files from
disque différent ex. C: -- > D:
basé sur la réponse décrit ici , en utilisant subprocess
est une autre option.
quelque chose comme ça:
subprocess.call("mv %s %s" % (source_files, destination_folder), shell=True)
je suis curieux de connaître les avantages et les inconvénients de cette méthode par rapport à shutil
. Comme dans mon cas j'utilise déjà subprocess
pour d'autres raisons et que cela semble fonctionner, je suis enclin à m'y tenir.
est-il peut-être dépendant du système?