Cómo mover un archivo en Python


Miré en la Pitón os interfaz, pero no pudo localizar un método para mover un archivo. ¿Cómo haría el equivalente de $ mv ... en Python?

>>> source_files = '/PATH/TO/FOLDER/*'
>>> destination_folder = 'PATH/TO/FOLDER'
>>> # equivalent of $ mv source_files destination_folder
Author: Aurgho Bhattacharjee, 2012-01-14

9 answers

os.rename() o shutil.move()

Ambos emplean la misma sintaxis:

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")

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

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

 822
Author: ig0774,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-12 03:43:08

Aunque os.rename() y shutil.move() ambos renombrarán archivos, el comando que está más cerca del comando Unix mv 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 le importa en qué disco están los archivos.

 199
Author: Jim Calfas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-30 21:28:33

Para cualquiera de los sistemas operativos.renombrar o shutil.mover 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']

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

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

Esta vez he comprobado dentro de la carpeta de origen para estar seguro de la impresionante.el archivo txt que creé existe. Es hay:)

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

 30
Author: jmontross,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-09 01:27:20

La respuesta aceptada no es la correcta, porque la pregunta no se trata de cambiar el nombre de un archivo a un archivo, sino de 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 destination debe tener un nombre de archivo explícito.

 8
Author: Javier Palacios,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-17 14:23:39

Esto es lo que estoy usando en este momento:

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.

 7
Author: Peter Vlaar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-13 21:44:13

Después de Python 3.4, también puede usar la clase pathlib Path para mover el archivo.

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
Author: MoonFruit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-12 07:39:25

Esta es la solución, que no habilita shell usando 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
Author: alper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
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 

Disco diferente ex. C: > > D:

 -1
Author: Ned Slark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-07 13:46:06

Basado en la respuesta descrita aquí, usar subprocess es otra opción.

Algo como esto:

subprocess.call("mv %s %s" % (source_files, destination_folder), shell=True)

Tengo curiosidad por saber los pros y los contras de este método en comparación con shutil. Dado que en mi caso ya estoy usando subprocess por otras razones y parece que funciona, me inclino a seguir con él.

¿Es dependiente del sistema tal vez?

 -1
Author: Bill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-16 01:50:30