2012-01-13 19 views
458

Miré en la interfaz de Python os, pero no pude encontrar un método para mover un archivo. ¿Cómo puedo hacer el equivalente de $ mv ... en Python?Cómo mover un archivo en Python

>>> source_files = '/PATH/TO/FOLDER/*' 
>>> destination_folder = 'PATH/TO/FOLDER' 
>>> # equivalent of $ mv source_files destination_folder 
+0

para aquellos que están familiarizados con [el comando 'mv' de gnu-coreutils] (https://www.gnu.org/software/coreutils/manual/html_node/mv-invocation.html),' shutil.move 'tiene un caso de borde donde difiere la función' shutil.move'. [Vaya aquí para una redacción completa] (https://stackoverflow.com/questions/31813504). ** En resumen, el 'shutil 'de Python.move' generará una excepción (pero gnu-coreutils 'mv' no) ** cuando su destino sea un directorio y el directorio ya tenga un archivo con el mismo nombre que la fuente (de nuevo para obtener más información, consulte el enlace provisto en el oración anterior). –

Respuesta

664

os.rename() o shutil.move()

Ambos emplean la misma sintaxis:

os.rename("path/to/current/file.foo", "path/to/new/desination/for/file.foo") 
shutil.move("path/to/current/file.foo", "path/to/new/destination/for/file.foo") 

Nótese que en ambos casos debe existir el directorio en el que se crea el nuevo archivo, (pero, en Windows, un archivo con ese nombre no debe o se generará una excepción). Tenga en cuenta también que debe incluir el nombre del archivo (file.foo) en los argumentos de origen y de destino. Si se cambia, el archivo cambiará de nombre o se moverá.

Como se ha observado en los comentarios de otras respuestas, shutil.move simplemente llama a os.rename en la mayoría de los casos. Sin embargo, si el destino está en un disco diferente de la fuente, en su lugar, copiará y luego eliminará el archivo fuente.

+4

¿Soy el único que piensa que os.rename no está funcionando para directorios? Cito: "Si dst es un directorio, OSError se levantará". – Fabian

+12

'shutil.move' funciona para directorios. Puede usar la ruta relativa 'shutil.move (f.name," tmp/")' o la ruta completa 'shutil.move (f.name,"/Users/hello/tmp/")', ** no usar * * ** '~' ** en la ruta, marcado en python2.7.9, Mac OS X. – whyisyoung

+2

'~' es una construcción de shell, y no tiene nada que ver con rutas de archivos per se, salvo como una convención fuera de lugar. Si realmente desea involucrar su directorio de inicio, use 'os.getenv ('HOME')' en su lugar, concatenándolo con partes de la ruta deseada, si es necesario. – amn

30

Para el os.rename o shutil.move tendrá que importar el módulo. No es necesario el carácter * para mover todos los archivos.

Tenemos una carpeta en/opt/awesome llamada source con un archivo llamado 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'] 

Utilizamos os.listdir para ver que el nombre de la carpeta de hecho cambió. Aquí está el shutil moviendo el destino a la fuente.

>>> import shutil 
>>> shutil.move(destination, source) 
>>> os.listdir('/opt/awesome/source') 
['awesome.txt'] 

Esta vez revisé dentro de la carpeta fuente para asegurarme de que el archivo awesome.txt que creé existe. Está allí :)

Ahora hemos movido una carpeta y sus archivos de un origen a un destino y viceversa.

+4

http://docs.python.org/2/library/shutil.html Esta documentación muestra que tiene sus parámetros cambiados para el método shutil.move. – mac10688

+1

Utilicé el destino y la fuente invertidos para ver que los archivos se movieron de la fuente y luego de vuelta a ella ... Pude ver cómo no está claro. – jmontross

180

Aunque os.rename() y shutil.move() cambiarán el nombre de los archivos, el comando más cercano al comando mv de Unix es shutil.move(). La diferencia es que os.rename() no funciona si el origen y el destino están en discos diferentes, mientras que shutil.move() no importa en qué disco están los archivos.

+52

'shutil.move()' utiliza 'os.rename()' si el destino está en el sistema de archivos actual. De lo contrario, 'shutil.move()' copia la fuente a destino usando 'shutil.copy2()' y luego elimina la fuente. –

+7

Tenga cuidado de darse cuenta de que ['shutil.copy2()' no puede copiar todos los metadatos de archivos] (https://docs.python.org/2/library/shutil.html), así que si eso sucede, es como ' cp -p' y luego 'rm', lo entiendo. – 2rs2ts

+9

Tenga en cuenta: shutil.move en Python 2.7.3 falla si el destino ya existe. Entonces, si eso es posible, capture el error o elimine manualmente el archivo/directorio, luego haga el movimiento. – Dana

8

La respuesta aceptada no es la correcta, porque la pregunta no es sobre cambiar el nombre de un archivo en un archivo, sino mover muchos archivos a un directorio. shutil.move hará el trabajo, pero para este propósito os.rename es inútil (como se indica en los comentarios) porque el destino debe tener un nombre de archivo explícito.

5

Esto es lo que estoy usando en la actualidad

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) 

ahora completamente funcional. Espero que esto te ayude.

Cuestiones relacionadas