2009-07-09 16 views
8

Estoy confundido con el archivo moviéndose bajo python. Bajo las ventanas de comandos, si tengo directorio c: \ ay un directorio c: \ b, puedo hacerMoviendo archivos bajo python

move c:\a c:\b 

que se mueve de A a consecuencia b es la estructura de directorio c: \ b \ a

Si intento esto con os.rename o shutil.move:

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

consigo

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

Si muevo una archivo único en c: \ a, funciona.

En python, ¿cómo muevo un directorio a otro existente?

+0

¿Desea mover todos los contenidos del directorio a otro directorio o mover el directorio? – 182764125216

Respuesta

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

es equivalente a

move c:\a c:\b 

debajo de las ventanas de comandos

0

Tendrá que indicar la ruta completa que está siendo movido a:

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 realidad, parece que shutil.move va a hacer lo que quiere mirando su documentación:

Si el destino es un directorio o un enlace simbólico a un directorio, la fuente se mueve dentro del directorio.

(Y su source.)

+0

Desafortunadamente, esto fallará si los archivos están ubicados en diferentes volúmenes. –

+0

@wuub: ¿Qué te hace decir eso? Los documentos dicen que hay un comportamiento peculiar en algunos sistemas de archivos UNIX, pero el OP está hablando de Windows. – cdleary

+0

Hmm, esto es sencillo para un solo directorio, pero mover una gran estructura de directorios a otra carpeta es realmente inconveniente de esta manera. Es bastante extraño que Python no sea compatible con esto. – Ash

8

Puedes probar a utilizar el módulo Shutil.

+2

Específicamente shutil.move (srcFile, destFile) – PTBNL

1

cuando necesito muchas de las operaciones del sistema de archivos Yo prefiero usar el módulo 'camino':
http://pypi.python.org/pypi/path.py/2.2

¡Es una envoltura bastante buena y ligera er alrededor del módulo 'os.path' incorporado.

también código:

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

es un poco extraño, porque no hay función especial para esto:

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

Punto excelente: se olvidó del nombre base. No me gusta cómo hay más de una forma de hacerlo. ;-) – cdleary

2

os.rename ("c:/a /", "c:/b "/) -> Cambia el nombre de la carpeta a en la carpeta b

os.cambiar el nombre ("c:/a /", "c:/b/a") -> carpeta Ponga b en la carpeta de un

0

El uso de Twisted FilePath:

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

o, más en general:

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