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
9 answers
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.
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.
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.
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.
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.
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
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)
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:
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?
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