Textinhalt suchen und damit txt-Datei umbenennen?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Snej
User
Beiträge: 2
Registriert: Donnerstag 17. Februar 2011, 20:34

Hi

ich bin neu hier und habe nicht die geringste Ahnung vom Programmieren...
Ich arbeite mit MacOS und bei meiner Suche nach einer Lösung für mein Problem hat man mir dieses Forum empfohlen.

Hier meine hoffnungslose Situation.

Momentan bezeichne ich manuell tausende txt-Dateien um.
Das zu automatisieren wäre ein Traum.

Alle diese txt-Dateien sind momentan nur mit Artikelnummern bezeichnet. Alle Dateien haben den Inhalt betreffend die gleiche Listenstruktur und Formatierung mit natürlich unterschiedlichen Angaben. zB.

Farbe...blau
Gewicht...53
Material...Kupfer
Jahr...1964
Code...en

usw. sowie eine Menge mehr Informationen

Ich möchte nun in den jeweiligen txt-Dateien (eigentlich allen) nach mehreren Kriterien suchen, deren Ergebnis herausführen und im Idealfall der txt Datei in deren Bezeichnung anfügen. Momentan mache ich das halt manuell.

Das würde beispielsweise bedeuten ich suche in der txt-Datei gleichzeitig nach den Stichworten Farbe, Jahr, Code und das Ergebnis wird dann automatisch/halbautomatisch der txt-Datei-Bezeichnung angefügt

zB.
vorher: 237492715.txt
nachher: 237492715 (blau 1964 en).txt

Ich gebe zu, sehr speziell, aber es war zumindest mal eine Abwechslung mal diesen Text als Frage einzustellen als die stupide manuelle Änderung der Dateien.

Schön wäre eine Art Programm das ich auch als blutiger Laie individuell anpassen kann.

Gibt es hier jemanden der mir irgendwie Hoffnung machen könnte?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ist die Syntax immer exakt so? Also

Code: Alles auswählen

Schlüssel...Wert
dienen die drei Punkte als Trenner? Gibt es noch Kommentarzeilen usw?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Snej hat geschrieben:Gibt es hier jemanden der mir irgendwie Hoffnung machen könnte?
Das lässt sich relativ einfach lösen. Lese alle Dateien ein. Oder noch einfacher, übergib sie einfach per Shell an Python, dann stehen alle Namen in sys.argv. Danach öffnest du sie der Reihe nach, suchst nach den passenden Informationen, z.B. mit regulären Ausdrücken, dann baust du den neuen Dateinamen und benennst die Datei um nachdem du sie wieder geschlossen hast.

Ungetestet:

Code: Alles auswählen

import os, re, sys

# für alle Argumente... 
# (sys.argv[0] enthält den Dateinamen des Script, daher weglassen)
for name in sys.argv[1:]:
    # einfach alles einlesen
    with open(name) as f:
        text = r.read()
    # jetzt die Wörter suchen
    m = re.search(r"^Farbe\.\.\.(\w+)", text, re.M)
    if m:
        color = m.group(1)
    ...
    # Annahme: name endet auf .txt.
    new_name = "%s (%s %s %s).txt" % (name[:-4], color, year, code)
    # umbenennen
    os.rename(name, new_name)
Stefan
bords0
User
Beiträge: 234
Registriert: Mittwoch 4. Juli 2007, 20:40

Auf der Lösung von sma aufbauend, ebenfalls ungetestet, ohne regexp (und evtl. leichter für Newbies anzupassen):

Code: Alles auswählen

import os, os.path, sys

for path in sys.argv[1:]:
    with open(path) as f:
        properties = dict(l.split("...") for l in f)
    root, ext = os.path.splitext(path)
    new_path = "{} ({Farbe} {Jahr} {Code}){}".format(root, ext, **properties)

    os.rename(path, new_path)
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Oh, das ist ja viel schöner. Aber du brauchst nicht `os.path` explizit zu importieren. Und wäre es nicht sicherer, `{0}` und `{1}` statt {} zu benutzen? Root würde ich noch base nennen und dann ist's perfekt ;)

Stefan
bords0
User
Beiträge: 234
Registriert: Mittwoch 4. Juli 2007, 20:40

sma hat geschrieben:Oh, das ist ja viel schöner. Aber du brauchst nicht `os.path` explizit zu importieren. Und wäre es nicht sicherer, `{0}` und `{1}` statt {} zu benutzen? Root würde ich noch base nennen und dann ist's perfekt ;)

Stefan
Ich stimme zu, außer dem letzten Satz, weil "root" in der Doku steht.
BlackJack

@bords0: Bei `split()` würde ich noch angeben, dass maximal einmal gesplittet werden soll, dann bekommt man keine Probleme mit Zeilen, in denen eventuell mehrere Trenner vorkommen.
Snej
User
Beiträge: 2
Registriert: Donnerstag 17. Februar 2011, 20:34

Hallo

da bin ich wieder.
Ich bin positiv überrascht das mein Anliegen lösbar ist und danke schon mal sehr für die Hilfe.

Das Wochenende kommt gerade recht um mich mit Python auseinanderzusetzen.

Um mein Beispiel noch etwas zu präzisieren.

Über 90% aller txt Dateien haben die gleiche Listenstruktur.
Bei manchen Inhalten ist die Reihenfolge vertauscht oder es ist eine Leerzeile dazwischen.
Auch tauchen in der Liste ein Eintrag 2x an unterschiedlicher Stelle auf.
(Meine Erstellung dieser txt Dateien hat sich auch über die Jahre entwickelt was die leichten Unterschiede erklärt)

Wird bei der Suche nach Worten gesucht, oder nach der Zeile in der sich die Worte befinden?
Kann ich ein Wort suchen und dafür eine Abkürzung oder eine vordefinierte Zeichenfolge als Ausgabe einstellen?

Aber wie gesagt, das Wochenende ist jetzt verplant um mich damit auseinanderzusetzen.
Antworten