Pregunta

¿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 coherente.

  

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

     

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

¿Fue útil?

Solución

Este cambio de nombre es bastante sencillo, por ejemplo, con os y glob modules:

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

Luego podría usarlo en su ejemplo como este:

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).

Otros consejos

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

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('.')]

Si no te importa usar expresiones regulares, esta función te dará mucho poder 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))

Entonces, en tu ejemplo, podrías hacerlo (asumiendo que es el directorio actual donde están los archivos):

renamer("*.doc", r"^(.*)\.doc
renamer("*.doc", r"^new\((.*)\)\.doc", r"\1.doc")
quot;, r"new(\1).doc")

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

<*>

y más.

Tengo esto para simplemente cambiar el nombre de todos los archivos en las 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 apariciones de old_str con cualquier caso por new_str.

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

  

Me gusta tener mi música, película y   archivos de imagen nombrados de cierta manera.   Cuando descargo archivos de la   Internet, por lo general no siguen mi   convenio de denominación. me encontré a mi mismo   renombrando manualmente cada archivo para que se ajuste a mi   estilo. Esto envejeció realmente rápido, así que   Decidí escribir un programa para hacerlo.   para mi.

     

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

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

He escrito un script en python por mi cuenta. Toma como argumentos la ruta del directorio en el que están presentes los archivos y el patrón de denominación que desea utilizar. Sin embargo, cambia su nombre adjuntando un número incremental (1, 2, 3 y así sucesivamente) al patrón de asignación de nombres que usted da.

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 te funcione.

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 

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

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]))
  

Estar en el directorio donde necesita realizar el cambio de nombre.

import os
# get the file name list to nameList
nameList = os.listdir() 
#loop through the name and rename
for fileName in nameList:
    rename=fileName[15:28]
    os.rename(fileName,rename)
#example:
#input fileName bulk like :20180707131932_IMG_4304.JPG
#output renamed bulk like :IMG_4304.JPG

en cuanto a mí, en mi directorio tengo varios subdirios, cada subdir tiene muchas imágenes. Quiero cambiar todas las imágenes de subdir 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

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

#  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

Este código funcionará

La función toma exactamente dos argumentos f_patth como tu ruta para cambiar el nombre del archivo y new_name como tu nuevo nombre al archivo.

import glob2
import os


def rename(f_path, new_name):
    filelist = glob2.glob(f_path + "*.ma")
    count = 0
    for file in filelist:
        print("File Count : ", count)
        filename = os.path.split(file)
        print(filename)
        new_filename = f_path + new_name + str(count + 1) + ".ma"
        os.rename(f_path+filename[1], new_filename)
        print(new_filename)
        count = count + 1
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top