Domanda

Esiste un modo semplice per rinominare un gruppo di file già contenuti in una directory, usando Python?

Esempio: ho una directory piena di file * .doc e voglio rinominarli in modo coerente.

  

X.doc - > & Quot; nuovo (X) doc "

     

Y.doc - > & Quot; nuovo (Y) doc "

È stato utile?

Soluzione

Tale ridenominazione è abbastanza semplice, ad esempio con os e glob moduli:

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

Potresti quindi usarlo nel tuo esempio in questo modo:

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

L'esempio sopra convertirà tutti i file * .doc in c: \ temp \ xx in new (% s) .doc , dove % s è il nome di base precedente del file (senza estensione).

Altri suggerimenti

Preferisco scrivere una piccola riga per ogni sostituzione che devo fare invece di creare un codice più generico e complesso. Per esempio:.

Sostituisce tutti i trattini bassi con trattini in qualsiasi file non nascosto nella directory corrente

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

Se non ti dispiace usare le espressioni regolari, questa funzione ti darebbe molto potere nel rinominare i file:

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

Quindi, nel tuo esempio, potresti farlo (supponendo che sia la directory corrente in cui si trovano i file):

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

ma puoi anche tornare ai nomi dei file iniziali:

<*>

e altro.

Ho questo per rinominare semplicemente tutti i file nelle sottocartelle della cartella

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

Sto sostituendo tutte le occorrenze di old_str con qualsiasi caso con new_str.

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

  

Mi piace avere la mia musica, film e   file di immagini denominati in un certo modo.   Quando scarico file da   Internet, di solito non seguono il mio   convenzione di denominazione. ho trovato me stesso   rinominare manualmente ogni file per adattarlo a my   stile. Questo è invecchiato davvero in fretta, quindi io   deciso di scrivere un programma per farlo   per me.

     

Questo programma può convertire il nome file   a tutte le lettere minuscole, sostituire le stringhe in   il nome file con quello che vuoi,   e tagliare un numero qualsiasi di caratteri da   la parte anteriore o posteriore del nome file.

È disponibile anche il codice sorgente del programma.

Ho scritto uno script Python per conto mio. Prende come argomenti il ??percorso della directory in cui sono presenti i file e il modello di denominazione che si desidera utilizzare. Tuttavia, rinomina assegnando un numero incrementale (1, 2, 3 e così via) al modello di denominazione che dai.

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

Spero che questo funzioni per te.

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 

Ho avuto un problema simile, ma volevo aggiungere del testo all'inizio del nome del file di tutti i file in una directory e ho usato un metodo simile. Vedi l'esempio seguente:

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

Essere nella directory in cui è necessario eseguire la ridenominazione.

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

quanto a me nella mia directory ho più sottodir, ogni sottodir ha molte immagini voglio cambiare tutte le immagini del sottodir in 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 own answer) 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

Questo codice funzionerà

La funzione accetta esattamente due argomenti f_patth come percorso per rinominare il file e new_name come nuovo nome del file.

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top