2011-08-23 11 views
5

Ho un codice che aggiunge la parola "_manual" alla fine di un carico di nomi di file. Ho bisogno di cambiare lo script in modo che cancelli le ultime due lettere del nome file (ES) e quindi lo sostituisce con _ES_Manual ad esempio: AC-5400ES.txt -> AC-5400_ES_manual.txtSostituzione di nomi file con python

In che modo incorporare tale funzione in questo codice?

folder = r"C:/Documents and Settings/DuffA/Bureaublad/test" 
import os # glob is unnecessary 
for root, dirs, filenames in os.walk(folder): 
    for filename in filenames: 
     fullpath = os.path.join(root, filename) 
     filename_split = os.path.splitext(fullpath) # filename and extensionname (extension in [1]) 
     filename_zero, fileext = filename_split 
     print fullpath, filename_zero + "_manual" + fileext 
     os.rename(fullpath, filename_zero + "_manual" + fileext) 
+1

Intendi EN o ES? – carlpett

+0

qual è il problema con lo script esistente ??? – rocksportrocker

+0

Intendevo ES spiacente! Non c'è alcun problema con lo script - ma ho bisogno di incorporare sostituendo l'ES attualmente nel nome del file in esso! scusa se questo è confuso! –

risposta

10

Prova questa:

import os 
pathiter = (os.path.join(root, filename) 
    for root, _, filenames in os.walk(folder) 
    for filename in filenames 
) 
for path in pathiter: 
    newname = path.replace('ES.txt', '_ES_manual.txt') 
    if newname != path: 
     os.rename(path,newname) 
+0

funziona anche come un fascino! - Come faccio a selezionare una risposta se entrambi funzionano? –

+0

accetterò questo perché mira specificatamente ai file ES! grazie! –

+0

Il codice di @Alice Duff _hughdbrown_ si applica solo ai nomi di file che terminano con "ES.txt". È corretto se si desidera modificare solo questi nomi di file. Il mio codice è più generico, cambia tutti i nomi di file alle 2 ultime lettere prima dell'estensione.Può capitare che non sia quello che vuoi, così puoi invocare un voto su _hughdbrown_. Ma puoi anche considerare di aggiungere una condizione nel mio codice per selezionare i nomi dei file da modificare, quindi il mio codice è più generale e adattabile. Devi considerare e scegliere. – eyquem

1

si potrebbe fare:

for filename in filenames: 
    print(filename) #should display AC-5400ES.txt 
    filename = filename.replace("ES.txt","ES_manual.txt") 
    print(filename) #should display AC-5400ES_manual.txt 
    fullpath = os.path.join(root, filename) 
    os.rename(fullpath, filename) 
+0

Ma ho bisogno di mantenere la parte iniziale del nome del file "AC-5400ES" - questo dovrebbe funzionare? –

+0

@Alice Duff: sì, questa istruzione prenderà la stringa del nome file e sostituirà ogni occorrenza di "ES.txt" e la sostituirà con "ES_manual.txt". Questo è il modo più semplice per gestire ciò che hai descritto. Se hai bisogno di qualcosa di più sofisticato, ti preghiamo di dirci cosa vuoi esattamente :) – JMax

+0

hmm .. ho provato questo e tutto rimane esattamente lo stesso! –

3
for root, dirs, filenames in os.walk(folder): 
    to_write = ['root == %s\n' % root] 

    for filename in filenames: 
     filename_zero, fileext = os.path.splitext(filename) 
     newname = "%s_%s_manual%s" % (filename_zero[:-2],filename_zero[-2:],fileext) 

     tu = (os.path.join(root, filename), os.path.join(root, newname)) 

     to_write.append('%s --> %s\n' % tu) 
     os.rename(*tu) 

    print '\n'.join(to_write) 
+0

funziona come un incantesimo! –

+0

@Alice Duff È affascinante il serpente! A proposito, uso l'oggetto ** to_write ** per ritardare la stampa in blocchi, in modo che l'esecuzione generale sia più veloce – eyquem

+0

ok grazie per il suggerimento! –

5

Per un introito più generali sulla risposta di hughdbrown. Questo codice può essere utilizzato per rimuovere qualsiasi carattere o set di caratteri.

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)