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
563
demandé sur Aurgho Bhattacharjee 2012-01-14 02:17:58

9 réponses

os.rename() ou shutil.move()

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.

822
répondu ig0774 2018-09-12 03:43:08

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.

199
répondu Jim Calfas 2013-05-30 21:28:33

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.

30
répondu jmontross 2013-05-09 01:27:20

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.

8
répondu Javier Palacios 2016-10-17 14:23:39

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.

7
répondu Peter Vlaar 2016-11-13 21:44:13

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

0
répondu MoonFruit 2018-10-12 07:39:25

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)
0
répondu alper 2018-10-12 08:17:28
  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:

-1
répondu Ned Slark 2018-05-07 13:46:06

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?

-1
répondu Bill 2018-06-16 01:50:30