2010-08-19 14 views
11

Einige Hintergrundinformationen: Wir haben ein uraltes webbasiertes Dokumenten-Datenbanksystem, in dem ich fast ausschließlich aus MS Office-Dokumenten mit den "normalen" Erweiterungen (.doc, .xls, .ppt). Sie werden alle basierend auf einer beliebigen ID-Nummer (d. H. 1245.doc) benannt. Wir wechseln zu SharePoint und ich muss alle diese Dateien umbenennen und sie in Ordner sortieren. Ich habe eine CSV-Datei mit allen Arten von Informationen (wie die ID-Nummer entspricht dem Titel des Dokuments), also verwende ich es, um diese Dateien umzubenennen. Ich habe ein kurzes Python-Skript geschrieben, das den ID-Nummer-Titel umbenennt.Python string.replace() ersetzt keine Zeichen

Allerdings haben einige der Titel der Dokumente Schrägstriche und andere möglicherweise schlechte Zeichen in einem Titel einer Datei haben, so möchte ich sie mit Unterstrichen ersetzt werden:

bad_characters = ["/", "\\", ":", "(", ")", "<", ">", "|", "?", "*"] 
for letter in bad_characters: 
    filename = line[2].replace(letter, "_") 
    foldername = line[5].replace(letter, "_") 
  • Beispiel line[2] : "blah blah langweilig - Treffen 19.02/2008.doc"
  • Beispiel line[5]: "Geschäftstreffen 2/2008"

Als ichhinzufügeninnerhalb der for Schleife, wird es den Brief drucken, der ersetzt werden soll, aber wird dieses Zeichen nicht tatsächlich durch einen Unterstrich ersetzen, wie ich es will.

Gibt es irgendetwas, was ich hier falsch mache?

+2

Tangentiale Frage: Haben Sie darüber nachgedacht, dies mit einem regulären Ausdruck zu tun? –

+0

@all - Danke für die Erklärungen. Ich kann nicht glauben, dass ich das übersehen habe. (donnerstags ...) – ZeroUptime

Antwort

23

Das liegt daran, filename und foldername mit jeder Iteration der Schleife weggeworfen werden. Die Methode .replace() gibt eine Zeichenfolge zurück, aber Sie speichern das Ergebnis nirgends.

sollten Sie verwenden:

filename = line[2] 
foldername = line[5] 

for letter in bad_characters: 
    filename = filename.replace(letter, "_") 
    foldername = foldername.replace(letter, "_") 

Aber ich würde es regex tun. Es ist sauberer und (wahrscheinlich) schneller:

p = re.compile('[/:()<>|?*]|(\\\)') 
filename = p.sub('_', line[2]) 
folder = p.sub('_', line[5]) 
+0

Es kann einen Grund geben, Zeile [2] und Zeile [5] nicht zu ändern –

+0

@Kathy Guter Punkt, feste Antwort – NullUserException

6

Sie weisen die Variablen filename und foldername bei jeder Iteration der Schleife neu zu. In der Tat wird nur * ersetzt.

4

Sie bei der Python-String-Methode translate() http://docs.python.org/library/string.html#string.translate mit http://docs.python.org/library/string.html#string.maketrans

diese Bearbeitung ein Beispiel, wie pro Kommentar Vorschlag hinzufügen unten aussehen:
import string 
toreplace=''.join(["/", "\\", ":", "(", ")", "<", ">", "|", "?", "*"]) 
underscore=''.join(['_'] * len(toreplace)) 
transtable = string.maketrans(toreplace,underscore) 
filename = filename.translate(transtable) 
foldername = foldername.translate(transtable) 

Kann vereinfachen, indem ich den Platz so etwas wie '/ \ :,' usw. ersetze, ich habe gerade verwendet, was oben gegeben wurde

+0

Könnten Sie im aktuellen Kontext Beispiele geben? – iamgopal

3

Sie beginnen mit der Grundlinie über anstatt das ersetzt Ergebnis zu speichern, so werden Sie das Äquivalent zu

bekommen
filename = line[2].replace('*', '_') 
foldername = line[5].replace('*', '_') 

Versuchen Sie, die folgende

bad_characters = ["/", "\\", ":", "(", ")", "<", ">", "|", "?", "*"] 
filename = line[2] 
foldername = line[5] 
for letter in bad_characters: 
    filename = filename.replace(letter, "_") 
    foldername = foldername.replace(letter, "_") 
1

String verwenden.replace (str, fromStr, toStr)

bad_characters = ["/", "\\", ":", "(", ")", "<", ">", "|", "?", "*"] 
for letter in bad_characters: 
    filename = string.replace(line[2], letter, "_") 
    foldername = string.replace(line[5], letter, "_") 
Verwandte Themen