2009-07-09 5 views
8

Je suis confus avec le déplacement d'un fichier sous python. Sous windows commandline, si j'ai répertoire c: \ a et un répertoire c: \ b, je peux faireDéplacement de fichiers sous python

move c:\a c:\b 

qui déplace un à résultat b est la structure du répertoire c: \ b \ a

Si j'essayer avec os.rename ou shutil.move:

os.rename("c:/a", "c:/b") 

Je reçois

WindowsError: [Error 17] Cannot create a file when that file already exists 

Si je déplace un fichier unique sous c: \ a, ça marche.

En python, comment déplacer un répertoire vers un autre répertoire existant?

+0

Voulez-vous déplacer tout le contenu du répertoire vers un autre répertoire ou déplacer le répertoire lui-même? – 182764125216

Répondre

16
os.rename("c:/a", "c:/b/a") 

est équivalent à

move c:\a c:\b 

sous windows commandline

0

Vous devrez indiquer le chemin complet, il est déplacé à:

src = 'C:\a' 
dst_dir = 'C:\b' 
last_part = os.path.split(src)[1] 
os.rename(src, os.path.join(dst_dir, last_part)) 

En fait, il ressemble shutil.move fera ce que vous voulez en regardant sa documentation:

Si la destination est un répertoire ou un lien symbolique vers un répertoire, la source est déplacée dans le répertoire.

(Et son source.)

+0

Malheureusement, cela échouera si les fichiers se trouvent sur des volumes différents. –

+0

@wuub: Qu'est-ce qui vous fait dire ça? Les docs disent qu'il y a un comportement bizarre dans certains systèmes de fichiers UNIX, mais l'OP parle de Windows. – cdleary

+0

Hmm, c'est simple pour un seul répertoire, mais déplacer une grande structure de répertoire vers un autre dossier est vraiment gênant de cette façon. Tout à fait étrange que python ne supporte pas cela. – Ash

8

Vous pouvez essayer d'utiliser le module Shutil.

+2

Spécifiquement shutil.move (srcFile, destFile) – PTBNL

1

Lorsque j'ai besoin de nombreuses opérations du système de fichiers que je préfère utiliser le module 'path':
http://pypi.python.org/pypi/path.py/2.2

Il est assez bon et léger autour du module "os.path" intégré.

Code aussi:

last_part = os.path.split(src)[1] 

est un peu étrange, parce que il y a fonction spéciale pour cela:

last_part = os.path.basename(src) 
+0

Excellent point - oublié le nom de base. Je n'aime pas comment il y a plus d'une façon de le faire. ;-) – cdleary

2

os.rename ("c:/a /", « c:/b "/) -> Modifie le nom du dossier a dans le dossier b

os.renommer ("c:/a /", "c:/b/a") -> Mettez le dossier b dans le dossier un

0

En utilisant FilePath de Twisted:

from twisted.python.filepath import FilePath 
FilePath("c:/a").moveTo(FilePath("c:/b/a")) 

ou, de façon plus générale:

from twisted.python.filepath import FilePath 
def moveToExistingDir(fileOrDir, existingDir): 
    fileOrDir.moveTo(existingDir.child(fileOrDir.basename())) 
moveToExistingDir(FilePath("c:/a"), FilePath("c:/b")) 
Questions connexes