Miré en la os
interfaz de Python , pero no pude encontrar 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
python
file
file-handling
David542
fuente
fuente
mv
comando de gnu-coreutils , Pythonshutil.move
tiene un caso extremo donde lashutil.move
función difiere. Vaya aquí para una redacción completa . En pocas palabras, Pythonshutil.move
generará una excepción (pero gnu-coreutilsmv
no lo hará) cuando su destino sea un directorio y el directorio ya tenga un archivo con el mismo nombre que la fuente (nuevamente para obtener más información, consulte el enlace proporcionado en la oración anterior) )os.system("mv file1 file2")
?Respuestas:
os.rename()
`shutil.move()
` oos.replace()
Todos emplean la misma sintaxis:
Tenga en cuenta que debe incluir el nombre del archivo (
file.foo
) en los argumentos de origen y destino. Si se cambia, el archivo cambiará de nombre y se moverá.Tenga en cuenta también que en los dos primeros casos, el directorio en el que se está creando el nuevo archivo ya debe existir. En Windows, un archivo con ese nombre no debe existir o se generará una excepción, pero
os.replace()
reemplazará silenciosamente un archivo incluso en ese caso.Como se ha señalado en los comentarios sobre otras respuestas,
shutil.move
simplemente llamaos.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.fuente
shutil.move
Funciona para directorios. Puede usar la ruta relativashutil.move(f.name, "tmp/")
o la ruta completashutil.move(f.name, "/Users/hello/tmp/")
, no la use~
en la ruta, verificada en python2.7.9, Mac OS X.~
es una construcción de shell y no tiene nada que ver con las rutas de archivo per se, aparte de una convención fuera de lugar. Si realmente desea involucrar su directorio de inicio, useos.getenv('HOME')
en su lugar, concatenando con partes de su ruta deseada, si es necesario.os.path.expanduser()
para expandir correctamente el '~
' de acuerdo con las reglas específicas del sistema operativo. Mucho más ordenado ya%HOME%
que no siempre está configurado en Windows.os.rename
no manejará archivos en diferentes dispositivos. Úseloshutil.move
si no está seguro de que el archivo de origen y el de destino están en el mismo dispositivo.Aunque
os.rename()
yshutil.move()
cambiará el nombre de los archivos, el comando más cercano al comando Unix mv esshutil.move()
. La diferencia es queos.rename()
no funciona si el origen y el destino están en discos diferentes, mientras queshutil.move()
no le importa en qué disco están los archivos.fuente
shutil.move()
se usaos.rename()
si el destino está en el sistema de archivos actual. De lo contrario,shutil.move()
copia el origen al destino usandoshutil.copy2()
y luego elimina el origen.shutil.copy2()
no se pueden copiar todos los metadatos de los archivos , por lo que si eso sucede es como hacerlocp -p
y luegorm
, me reúno.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 llamada fuente con un archivo llamado awesome.txt.
Usamos os.listdir para ver que el nombre de la carpeta de hecho cambió. Aquí está el shutil moviendo el destino de regreso a la fuente.
Esta vez revisé dentro de la carpeta de origen para asegurarme de que existe el archivo awesome.txt que creé. Está ahí :)
Ahora hemos movido una carpeta y sus archivos de una fuente a un destino y viceversa.
fuente
Después de Python 3.4, también puede usar
pathlib
la clase 'sPath
para mover el archivo.https://docs.python.org/3.4/library/pathlib.html#pathlib.Path.rename
fuente
Esto es lo que estoy usando en este momento:
Ahora completamente funcional. Espero que esto te ayude.
Editar:
He convertido esto en una función, que acepta un directorio de origen y destino, haciendo 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, entonces usa el patrón
'*.jpg'
, de forma predeterminada, mueve todo en el directoriofuente
os.path.join(parent_path, filename)
en lugar de la concatenación de cadenas para evitar problemas multiplataformaLa respuesta aceptada no es la correcta, porque la pregunta no es cambiar el nombre de un archivo a un archivo, sino mover muchos archivos a un directorio.
shutil.move
hará el trabajo, pero para este propósitoos.rename
es inútil (como se indica en los comentarios) porque el destino debe tener un nombre de archivo explícito.fuente
os.path.basename(my_file_path)
y los directorios de archivos conos.path.dirname(my_file_path)
. Además, el OP no dejó muy claro si quería mover varios archivos. Mencionó mover solo un archivo en la pregunta, pero su código de ejemplo implicaba mover múltiples archivos.Según la respuesta que se describe aquí , usar
subprocess
es otra opción.Algo como esto:
Tengo curiosidad por saber las ventajas y desventajas de este método en comparación
shutil
. Como en mi caso ya lo estoy usandosubprocess
por otros motivos y parece funcionar, me inclino a seguir con él.¿Es dependiente del sistema tal vez?
fuente
mv
se use con éxito en un sistema operativo Windows.Esta es la solución, que no permite el
shell
usomv
.fuente
disco diferente ej. C: -> D:
fuente
f"{new_path}{f}"
pero dado que no tiene texto estático en su cadena, esto puede ser más trabajo ... He estado tratando de acostumbrarme a usar cuerdas f sin embargo.