Cómo mover un archivo en Python

Busqué en la interfaz del sistema operativo de Python, pero no pude encontrar un método para mover un archivo. ¿Cómo haría el equivalente a $ mv ... en Python?

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

os.rename() o shutil.move()

Ambos emplean la misma syntax:

 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, no debe existir un archivo con ese nombre o se generará una excepción). También tenga en cuenta que debe incluir el nombre del archivo ( file.foo ) en los argumentos de origen y destino. Si se cambia, el nombre del archivo se cambiará y se moverá.

Como se ha señalado en los comentarios sobre otras 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 origen, en su lugar, copiará y luego eliminará el archivo de origen.

Aunque os.rename() y shutil.move() cambiarán el nombre de los archivos, el comando más cercano al comando shutil.move() 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 a shutil.move() no le importa en qué disco están los archivos.

Ya sea para os.rename o shutil.move, deberá importar el módulo. No es necesario un carácter * para mover todos los archivos.

Tenemos una carpeta en / opt / awesome llamado origen 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 cierre moviendo el destino de nuevo a la fuente.

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

Esta vez revisé dentro de la carpeta de origen para asegurarme de que el archivo awesome.txt que creé existe. Está ahí 🙂

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

La respuesta aceptada no es la correcta, ya que la pregunta no es acerca 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 el destino debe tener un nombre de archivo explícito.

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.

Editar:

He convertido esto en una función, que acepta un directorio de origen y destino, creando la carpeta de destino si no existe y mueve los archivos. También permite el filtrado de los archivos src, por ejemplo, si solo desea mover imágenes, luego usa el patrón '*.jpg' , de forma predeterminada, mueve todo el contenido del directorio.

 import os, shutil, pathlib, fnmatch def move_dir(src: str, dst: str, pattern: str = '*'): if not os.path.isdir(dst): pathlib.Path(dst).mkdir(parents=True, exist_ok=True) for f in fnmatch.filter(os.listdir(src), pattern): shutil.move(os.path.join(src, f), os.path.join(dst, f)) 

Después de Python 3.4, también puede usar la pathlib de clase de pathlib 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

Basado en la respuesta que se describe 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 shutil de este método en comparación con shutil . Ya que en mi caso ya estoy usando el subprocess por otras razones y parece funcionar, me inclino a seguirlo.

¿Es dependiente del sistema tal vez?

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 
  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: