ver una rutas recorrer nombre leer ficheros directorio con carpeta archivos archivo abrir python file-io rename batch-rename

python - una - Cambio de nombre de lote de archivos en un directorio



rutas de archivos en python (10)

En cuanto a mí, en mi directorio tengo múltiples subdirectorios, cada subdirectorio tiene muchas imágenes. Quiero cambiar todas las imágenes del subdirectorio a 1.jpg ~ n.jpg

def batch_rename(): base_dir = ''F:/ad_samples/test_samples/'' sub_dir_list = glob.glob(base_dir + ''*'') # print sub_dir_list # like that [''F:/dir1'', ''F:/dir2''] for dir_item in sub_dir_list: files = glob.glob(dir_item + ''/*.jpg'') i = 0 for f in files: os.rename(f, os.path.join(dir_item, str(i) + ''.jpg'')) i += 1

(mys propia respuesta) https://stackoverflow.com/a/45734381/6329006

¿Existe una manera fácil de cambiar el nombre de un grupo de archivos que ya están contenidos en un directorio, usando Python?

Ejemplo: Tengo un directorio lleno de archivos * .doc y quiero cambiarles el nombre de forma consistente.

X.doc -> "nuevo (X) .doc"

Y.doc -> "nuevo (Y) .doc"


He escrito un script de Python por mi cuenta. Toma como argumentos la ruta del directorio en el que están presentes los archivos y el patrón de nombres que desea usar. Sin embargo, cambia el nombre adjuntando un número incremental (1, 2, 3, etc.) al patrón de nomenclatura otorgado.

import os import sys # checking whether path and filename are given. if len(sys.argv) != 3: print "Usage : python rename.py <path> <new_name.extension>" sys.exit() # splitting name and extension. name = sys.argv[2].split(''.'') if len(name) < 2: name.append('''') else: name[1] = ".%s" %name[1] # to name starting from 1 to number_of_files. count = 1 # creating a new folder in which the renamed files will be stored. s = "%s/pic_folder" % sys.argv[1] try: os.mkdir(s) except OSError: # if pic_folder is already present, use it. pass try: for x in os.walk(sys.argv[1]): for y in x[2]: # creating the rename pattern. s = "%spic_folder/%s%s%s" %(x[0], name[0], count, name[1]) # getting the original path of the file to be renamed. z = os.path.join(x[0],y) # renaming. os.rename(z, s) # incrementing the count. count = count + 1 except OSError: pass

Espero que esto funcione para usted.


Prefiero escribir líneas pequeñas para cada reemplazo que tengo que hacer en lugar de hacer un código más genérico y complejo. P.ej:

Esto reemplaza todos los guiones bajos con guiones en cualquier archivo no oculto en el directorio actual

import os [os.rename(f, f.replace(''_'', ''-'')) for f in os.listdir(''.'') if not f.startswith(''.'')]


Pruebe: http://www.mattweber.org/2007/03/04/python-script-renamepy/

Me gusta tener mis archivos de música, películas y fotos nombrados de cierta manera. Cuando descargo archivos de Internet, generalmente no siguen mi convención de nombres. Me encontré cambiando manualmente el nombre de cada archivo para que se ajuste a mi estilo. Esto se hizo realmente rápido, así que decidí escribir un programa para hacerlo por mí.

Este programa puede convertir el nombre de archivo a minúsculas, reemplazar cadenas en el nombre de archivo con lo que desee y recortar cualquier cantidad de caracteres de la parte frontal o posterior del nombre de archivo.

El código fuente del programa también está disponible.


Si no te importa usar expresiones regulares, esta función te daría mucha potencia para cambiar el nombre de los archivos:

import re, glob, os def renamer(files, pattern, replacement): for pathname in glob.glob(files): basename= os.path.basename(pathname) new_filename= re.sub(pattern, replacement, basename) if new_filename != basename: os.rename( pathname, os.path.join(os.path.dirname(pathname), new_filename))

En su ejemplo, podría hacerlo (suponiendo que sea el directorio actual donde están los archivos):

renamer("*.doc", r"^(.*)/.doc$", r"new(/1).doc")

pero también puede retroceder a los nombres de archivo iniciales:

renamer("*.doc", r"^new/((.*)/)/.doc", r"/1.doc")

y más.


Tal cambio de nombre es bastante fácil, por ejemplo con los módulos os y glob :

import glob, os def rename(dir, pattern, titlePattern): for pathAndFilename in glob.iglob(os.path.join(dir, pattern)): title, ext = os.path.splitext(os.path.basename(pathAndFilename)) os.rename(pathAndFilename, os.path.join(dir, titlePattern % title + ext))

Podrías usarlo en tu ejemplo así:

rename(r''c:/temp/xx'', r''*.doc'', r''new(%s)'')

El ejemplo anterior convertirá todos los archivos *.doc en c:/temp/xx dir a new(%s).doc , donde %s es el nombre base anterior del archivo (sin extensión).


Tengo esto para simplemente cambiar el nombre de todos los archivos en subcarpetas de la carpeta

import os def replace(fpath, old_str, new_str): for path, subdirs, files in os.walk(fpath): for name in files: if(old_str.lower() in name.lower()): os.rename(os.path.join(path,name), os.path.join(path, name.lower().replace(old_str,new_str)))

Estoy reemplazando todas las ocurrencias de old_str con cualquier caso por new_str.


Tuve un problema similar, pero quería agregar texto al comienzo del nombre de archivo de todos los archivos en un directorio y usé un método similar. Vea el siguiente ejemplo:

folder = r"R:/mystuff/GIS_Projects/Website/2017/PDF" import os for root, dirs, filenames in os.walk(folder): for filename in filenames: fullpath = os.path.join(root, filename) filename_split = os.path.splitext(filename) # filename will be filename_split[0] and extension will be filename_split[1]) print fullpath print filename_split[0] print filename_split[1] os.rename(os.path.join(root, filename), os.path.join(root, "NewText_2017_" + filename_split[0] + filename_split[1]))


# another regex version # usage example: # replacing an underscore in the filename with today''s date # rename_files(''..//output'', ''(.*)(_)(.*/.CSV)'', ''/g<1>_20180402_/g<3>'') def rename_files(path, pattern, replacement): for filename in os.listdir(path): if re.search(pattern, filename): new_filename = re.sub(pattern, replacement, filename) new_fullname = os.path.join(path, new_filename) old_fullname = os.path.join(path, filename) os.rename(old_fullname, new_fullname) print(''Renamed: '' + old_fullname + '' to '' + new_fullname


directoryName = "Photographs" filePath = os.path.abspath(directoryName) filePathWithSlash = filePath + "//" for counter, filename in enumerate(os.listdir(directoryName)): filenameWithPath = os.path.join(filePathWithSlash, filename) os.rename(filenameWithPath, filenameWithPath.replace(filename,"DSC_" + / str(counter).zfill(4) + ".jpg" )) # e.g. filename = "photo1.jpg", directory = "c:/users/Photographs" # The string.replace call swaps in the new filename into # the current filename within the filenameWitPath string. Which # is then used by os.rename to rename the file in place, using the # current (unmodified) filenameWithPath. # os.listdir delivers the filename(s) from the directory # however in attempting to "rename" the file using os # a specific location of the file to be renamed is required. # this code is from Windows