2011-08-23 14 views
5

Mam trochę kodu, który dodaje słowo "_manual" na końcu ładunku nazw plików .. Potrzebuję zmienić skrypt, aby usunął dwie ostatnie litery nazwy pliku (ES) a następnie zamienia go na _ES_Manual na przykład: AC-5400ES.txt -> AC-5400_ES_manual.txtZastępowanie znaków nazw plików pytonem

Jak mogę włączyć tę funkcję do tego kodu?

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

Masz na myśli EN lub ES? – carlpett

+0

jaki jest problem z istniejącym skryptem ??? – rocksportrocker

+0

Mam na myśli ES przepraszam! Nie ma problemu ze skryptem - ale muszę wprowadzić do niego zmianę ES w pliku! przepraszam, jeśli to jest mylące! –

Odpowiedz

10

Spróbuj tego:

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

to również działa jak urok! - jak wybrać odpowiedź, jeśli oba działają? –

+0

Przyjmę to, ponieważ jest specjalnie ukierunkowane na pliki ES! Dziękuję Ci! –

+0

@Alice Duff _hughdbrown_ kod odnosi się tylko do nazw plików kończących się na "ES.txt". To jest poprawne, jeśli chcesz zmienić tylko te nazwy plików. Mój kod jest bardziej ogólny, zmienia wszystkie nazwy plików na 2 ostatnie litery przed rozszerzeniem.Może się zdarzyć, że nie jest to, czego chcesz, więc możesz upvote _hughdbrown_. Ale możesz także rozważyć dodanie warunku w moim kodzie, aby wybrać nazwy plików do zmiany, dlatego mój kod jest bardziej ogólny i dostosowalny. Musisz wziąć pod uwagę i wybrać. – eyquem

1

można zrobić:

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

Ale muszę zachować początkową część nazwy pliku "AC-5400ES" - czy to działałoby w tym celu? –

+0

@Alice Duff: tak, ta instrukcja pobierze ciąg nazwy pliku i zastąpi każde wystąpienie "ES.txt" i zastąpi go "ES_manual.txt". To jest najprostszy sposób na to, co opisałeś. Jeśli potrzebujesz czegoś bardziej wyrafinowanego, powiedz nam, czego dokładnie chcesz :) – JMax

+0

hmm .. próbowałem tego i wszystko po prostu pozostaje takie samo! –

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

działa jak urok! –

+0

@ Alice Duff To urocze wąż! Nawiasem mówiąc, używam obiektu ** do_write **, aby opóźnić drukowanie w porcjach, aby ogólne wykonanie było szybsze – eyquem

+0

ok dzięki za wskazówkę! –

5

Dla bardziej ogólnego spojrzenia na odpowiedź hughdbrown użytkownika. Ten kod może być użyty do usunięcia dowolnego znaku lub zestawu znaków.

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)