manejo - Renombra mĂșltiples archivos en un directorio en Python
rename files in directory python (15)
Esta pregunta ya tiene una respuesta aquí:
- Cómo cambiar el nombre de un archivo usando Python 10 respuestas
- Renombra múltiples archivos en Python 2 respuestas
Estoy tratando de cambiar el nombre de algunos archivos en un directorio usando Python.
Digamos que tengo un archivo llamado CHEESE_CHEESE_TYPE.***
y quiero eliminar CHEESE_
para que mi nombre de archivo resultante sea CHEESE_TYPE
Estoy intentando usar os.path.split
pero no funciona correctamente. También he considerado usar manipulaciones de cuerdas, pero tampoco he tenido éxito con eso.
¿Qué pasa con esto?
import re
p = re.compile(r''_'')
p.split(filename, 1) #where filename is CHEESE_CHEESE_TYPE.***
Aquí hay un script basado en su comentario más reciente.
#!/usr/bin/env python
from os import rename, listdir
badprefix = "cheese_"
fnames = listdir(''.'')
for fname in fnames:
if fname.startswith(badprefix*2):
rename(fname, fname.replace(badprefix, '''', 1))
Aquí hay una solución más general:
Este código puede usarse para eliminar cualquier carácter particular o conjunto de caracteres recursivamente de todos los nombres de archivo dentro de un directorio y reemplazarlos con cualquier otro carácter, conjunto de caracteres o ningún carácter.
import os
paths = (os.path.join(root, filename)
for root, _, filenames in os.walk(''C:/FolderName'')
for filename in filenames)
for path in paths:
# the ''#'' in the example below will be replaced by the ''-'' in the filenames in the directory
newname = path.replace(''#'', ''-'')
if newname != path:
os.rename(path, newname)
El siguiente código debería funcionar. Toma cada nombre de archivo en el directorio actual, si el nombre de archivo contiene el patrón CHEESE_CHEESE_
entonces se le cambia el nombre. Si no se hace nada al nombre del archivo.
import os
for fileName in os.listdir("."):
os.rename(fileName, fileName.replace("CHEESE_CHEESE_", "CHEESE_"))
Este comando eliminará la cadena inicial "CHEESE_" de todos los archivos en el directorio actual, usando el renamer :
$ renamer --find "/^CHEESE_/" *
Este tipo de cosas está perfectamente adaptado para IPython, que tiene integración de shell.
In [1] files = !ls
In [2] for f in files:
newname = process_filename(f)
mv $f $newname
Nota: para almacenar esto en un script, use la extensión .ipy
y prefija todos los comandos de shell con !
.
Véase también: http://ipython.org/ipython-doc/stable/interactive/shell.html
Esto funciona para mi
import os
for afile in os.listdir(''.''):
filename, file_extension = os.path.splitext(afile)
if not file_extension == ''.xyz'':
os.rename(afile, filename + ''.abc'')
Originalmente estaba buscando alguna GUI que permitiera cambiar el nombre usando expresiones regulares y que tuviera una vista previa del resultado antes de aplicar los cambios.
En Linux, he usado krename con éxito, en Windows Total Commander se renombra con expresiones regulares, pero no encontré un equivalente libre decente para OSX, así que terminé escribiendo un script de Python que funciona de forma recursiva y, por defecto, solo imprime los nuevos nombres de archivo sin hacer ningún cambios Agregue el interruptor ''-w'' para modificar realmente los nombres de los archivos.
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import fnmatch
import sys
import shutil
import re
def usage():
print """
Usage:
%s <work_dir> <search_regex> <replace_regex> [-w|--write]
By default no changes are made, add ''-w'' or ''--write'' as last arg to actually rename files
after you have previewed the result.
""" % (os.path.basename(sys.argv[0]))
def rename_files(directory, search_pattern, replace_pattern, write_changes=False):
pattern_old = re.compile(search_pattern)
for path, dirs, files in os.walk(os.path.abspath(directory)):
for filename in fnmatch.filter(files, "*.*"):
if pattern_old.findall(filename):
new_name = pattern_old.sub(replace_pattern, filename)
filepath_old = os.path.join(path, filename)
filepath_new = os.path.join(path, new_name)
if not filepath_new:
print ''Replacement regex {} returns empty value! Skipping''.format(replace_pattern)
continue
print new_name
if write_changes:
shutil.move(filepath_old, filepath_new)
else:
print ''Name [{}] does not match search regex [{}]''.format(filename, search_pattern)
if __name__ == ''__main__'':
if len(sys.argv) < 4:
usage()
sys.exit(-1)
work_dir = sys.argv[1]
search_regex = sys.argv[2]
replace_regex = sys.argv[3]
write_changes = (len(sys.argv) > 4) and sys.argv[4].lower() in [''--write'', ''-w'']
rename_files(work_dir, search_regex, replace_regex, write_changes)
Ejemplo de caso de uso
Quiero cambiar partes de un nombre de archivo de la siguiente manera, es decir, mover el bit m7-08
al principio del nombre de archivo:
# Before:
Summary-building-mobile-apps-ionic-framework-angularjs-m7-08.mp4
# After:
m7-08_Summary-building-mobile-apps-ionic-framework-angularjs.mp4
Esto realizará una ejecución en seco e imprimirá los nuevos nombres de archivos sin cambiar el nombre de ningún archivo:
rename_files_regex.py . "([^/.]+?)-(m//d+-//d+)" "//2_//1"
Esto hará el cambio de nombre real (puede usar -w
o --write
):
rename_files_regex.py . "([^/.]+?)-(m//d+-//d+)" "//2_//1" --write
Parece que su problema es más para determinar el nuevo nombre de archivo en lugar de cambiar el nombre en sí mismo (para lo cual podría usar el método os.rename).
De su pregunta no queda claro cuál es el patrón que desea cambiar de nombre. No hay nada malo con la manipulación de cuerdas. Una expresión regular puede ser lo que necesitas aquí.
Prueba esto:
import os
import shutil
for file in os.listdir(dirpath):
newfile = os.path.join(dirpath, file.split("_",1)[1])
shutil.move(os.path.join(dirpath,file),newfile)
Supongo que no desea eliminar la extensión de archivo, pero puede hacer la misma división con puntos.
Puede usar la función os.system para simplificar e invocar a bash para realizar la tarea:
import os
os.system(''mv old_filename new_filename'')
Suponiendo que ya está en el directorio, y que los "primeros 8 caracteres" de su comentario siempre son verdaderos. (Aunque "CHEESE_" tiene 7 caracteres ... Si es así, cambie los 8 a continuación)
from glob import glob
from os import rename
for fname in glob(''*.prj''):
rename(fname, fname[8:])
Tengo el mismo problema, donde quiero reemplazar el espacio en blanco. en cualquier archivo pdf a un guión
-
. Pero los archivos estaban en múltiples subdirectorios. Por lo tanto, tuve que usar os.walk()
. En su caso para múltiples subdirectorios, podría ser algo como esto:
import os
for dpath, dnames, fnames in os.walk(''/path/to/directory''):
for f in fnames:
os.chdir(dpath)
if f.startswith(''cheese_''):
os.rename(f, f.replace(''cheese_'', ''''))
Utilice os.rename(src, dst)
para cambiar el nombre o mover un archivo o un directorio.
$ ls
cheese_cheese_type.bar cheese_cheese_type.foo
$ python
>>> import os
>>> for filename in os.listdir("."):
... if filename.startswith("cheese_"):
... os.rename(filename, filename[7:])
...
>>>
$ ls
cheese_type.bar cheese_type.foo
importar o importar la cadena def rename_files ():
#List all files in the directory
file_list = os.listdir("/Users/tedfuller/Desktop/prank/")
print(file_list)
#Change current working directory and print out it''s location
working_location = os.chdir("/Users/tedfuller/Desktop/prank/")
working_location = os.getcwd()
print(working_location)
#Rename all the files in that directory
for file_name in file_list:
os.rename(file_name, file_name.translate(str.maketrans("","",string.digits)))
rename_files ()