2017-01-25 8 views
3

Hallo Ich habe eine Reihe von verschiedenen Dateien, die in etwas anderes umbenannt werden müssen. Ich bin so weit gekommen, aber ich möchte es haben, so dass ich viele zu ersetzende Elemente und ihre entsprechenden Ersetzungen haben kann, anstatt jedes einzelne auszugeben, den Code auszuführen und ihn dann erneut einzugeben. Auch muss ich die Umbenennungs nur auf einen Teil der Datei ändern nicht die ganze Sache so, wenn es eine „Cat5e_1mBend1bottom50m2mBend2top-Aqeoiu31“ es wäre es nur ändern „'Cat5e50m1mBED_50m2mBE2U-Aqeoiu31 Lauf Python 2,5Python ändert einen Teil eines Dateinamens

import os, glob 

name_map = { 
    "Cat5e_1mBend1bottom50m2mBend2top": 'Cat5e50m1mBED_50m2mBE2U' 
} 

#searches for roots, directory and files 
for root,dirs,files in os.walk(r"H:\My Documents\CrossTalk"): 
    for f in files: 
     if f in name_map: 
      try: 
      os.rename(os.path.join(root, f), os.path.join(root, name_map[f])) 
      except FileNotFoundError, e: 
      #except FileNotFoundError as e: # python 3 
      print(str(e)) 
+0

Haben Sie eine Regel, die verwendet werden kann, um die umzubenennenden Dateien oder eine Liste solcher Dateinamen zu erkennen? Haben Sie eine andere Regel, die erklärt, wie man einen alten Namen in den neuen Namen umwandelt? – DyZ

+1

Sie müssen die 'name_map' für jede Datei durchlaufen und nach einem Teilstring im Dateinamen suchen (z. B.' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'name' ') – yedpodtrzitko

+0

@ yedpodtrzitko das wird nur einen Teil der Zeichenfolge ändern? Können Sie die Lösung veröffentlichen, wenn Sie es haben, weil ich Ihnen nicht ganz folge – VisualExstasy

Antwort

1

Wie von Hector hervorgehoben, ist der einfachste Weg, diese Aufgabe zu erfüllen, die Verwendung regulärer Ausdrücke. Zum Glück hat Python ein exzellentes Modul für reguläre Ausdrücke mit dem Namen re. Im Wesentlichen prüfen wir, ob eines der Muster, die wir in name_map angegeben haben, mit der aktuellen Datei übereinstimmt, die wir betrachten. Wenn das Muster übereinstimmt, wird NUR das übereinstimmende Teil ausgeschnitten und dann umbenannt.

import os, glob, re 

name_map = { 
    "bad": "good", 
    "cat": "dog" 
} 

for root, dirs, files in os.walk(r"/Users/.../start/"): 
    for f in files: 
     for name in name_map.keys(): 
      if re.search(name,f) != None: 
       new_name = re.sub(name,name_map[name],f) 
       try: 
        os.rename(os.path.join(root,f), os.path.join(root, new_name)) 
       except OSError: 
        print "No such file or directory!" 

So etwas Verzeichnis gegeben start mit dem Inhalt: bad_name.txt catdogcat.csv

Dies wird Skript benennen Sie sie auf: good_name.txt dogdogdog.csv

Die beiden wichtigsten Imbissbuden aus dieser sein sollte, wie man Verwenden Sie die Methoden re.search() und re.sub(). re.search(pattern, string) sucht nach dem Muster in der angegebenen Zeichenfolge. Wenn es gefunden wird, gibt es ein Match Objekt zurück und wenn es das nicht tut, gibt es stattdessen None zurück. Dies macht das Testen eines Musters in einem String zum Kinderspiel. Sobald wir festgestellt haben, dass das Muster existiert, besteht der nächste Schritt darin, es durch unseren neuen Namen zu ersetzen. Geben Sie die re.sub() Methode ein. re.sub(pattern, replace, string) sucht nach einem Muster in der angegebenen Zeichenfolge und ersetzt dieses Muster durch den Inhalt von replace.

Ich empfehle Ihnen sehr, sich the docs for the re module zu betrachten, da es sehr leistungsfähig ist und verwendet werden kann, um eine Anzahl von Problemen zu lösen.

+0

Vielen Dank, es hat funktioniert – VisualExstasy

0

Sie sollten Blick auf jeden Fall in regular expressions.

Wenn Sie eine Musterdefinition von dem, was Sie benötigen, zu ändern und den Austausch, es ist wirklich einfach mit re.sub

+0

Kann es nicht herausfinden – VisualExstasy

0

so etwas wie das?

files = ['something', 'nothing', 'no_really_not', 
     'something_something', 'nothing_to_replace'] 
name_map = {'nothing': 'something', 
      'something': 'nothing'} 

for f in files: 
    for pat, rep in name_map.iteritems(): 
     if f.find(pat) >= 0: 
      f_new = f.replace(pat, rep) 
      print('Rename {} -> {}'.format(f, f_new)) 
      break 
    else: 
     print('Keep {}'.format(f)) 

Das ist ziemlich Fußgänger. Nicht gut, wenn mehrere Ersetzungen für eine Datei berücksichtigt werden sollten ...

+0

Wie sortiert sich das durch meine Verzeichnisse obwohl? – VisualExstasy

+0

Sie hatten anscheinend kein Problem mit dem 'os.walk' Teil oder der tatsächlichen Umbenennung. Also habe ich das aus Gründen der Klarheit weggelassen. – hvwaldow

+0

wenn es dir nichts ausmacht kannst du es mir Schritt für Schritt erklären. Ich will nur extra Klarheit – VisualExstasy

Verwandte Themen