Automatisches Auslesen von Dateien und Erstellen einer Neuen

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.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@Humpalumpa
Uiuiui, da fehlen Dir aber doch ein paar Basics. Ich empfehle Dir, einmal das offizielle Python Tutorial durchzuarbeiten...
Humpalumpa hat geschrieben:Ich kann mittels re.findall doch nur konkrete Strings suchen oder?
Na eben nicht, denn hättest Du einen "konkreten String", dann müsstest Du ihn ja nicht suchen, oder? Ein regulärer Ausdruck ist letztlich ein Schema, das auf einen String angewendet wird. Das Ergebnis ist dann all das, das auf das Schema passt.
Die Funktion `findall()` erwartet 2 Argumente. Erstens den regulären Ausdruck, also das Schema. Zweitens den String, der durchsucht werden soll. In unseren Beispielen haben wir ja nur der Einfachheit halber dort einen "konkreten String" angegeben. Natürlich wird später einmal an dessen Stelle ein Name stehen, in etwa sowas:

Code: Alles auswählen

with open(filename, 'r') as file:
    for line in file:
        result = re.findall(r'threadname="(.*)"', line)
        ...
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@Humpalumpa: um das ganze abzukürzen:

Code: Alles auswählen

with open('datei.cfg') as cfg:
    threadnames = re.findall('threadname="(.*?)"', cfg.read())
Und jetzt finde den Unterschied zu Deinen Versuchen.
Humpalumpa
User
Beiträge: 9
Registriert: Montag 8. September 2014, 08:04

mutetella hat geschrieben: Die Funktion `findall()` erwartet 2 Argumente. Erstens den regulären Ausdruck, also das Schema. Zweitens den String, der durchsucht werden soll. In unseren Beispielen haben wir ja nur der Einfachheit halber dort einen "konkreten String" angegeben. Natürlich wird später einmal an dessen Stelle ein Name stehen, in etwa sowas:

Code: Alles auswählen

with open(filename, 'r') as file:
    for line in file:
        result = re.findall(r'threadname="(.*)"', line)
        ...
mutetella
Ahaa, jetzt verstehe ich. Tut mir leid, das hat lange gedauert, ich habe jetzt auch das richtige schonmal rausbekommen. Vielen vielen Dank! :D

Ja ich bin noch ein ziemlicher Newbie im Programmieren und Python hab ich vor 5 Jahren in der Schule gehabt. Jetzt komme ich nicht drum herum, lerne hier aber viel dazu. Das Tutorial hab ich mir auch mal angesehen, aber habe nicht alles gelesen. Mir wurde beigebracht immer nur nach dem zu suchen, was man braucht, anstatt erstmal so einen Berg an Informationen durchzuarbeiten. Ich weiß selbst noch nicht, welcher Ansatz besser ist.

Also noch einmal: Vielen Dank!
Ich werde jetzt erstmal Mittagspause machen und mich dann dran setzen. Ich halte euch auf dem Laufenden und auch, falls woanders noch Fragen auftreten sollten. :)
Humpalumpa
User
Beiträge: 9
Registriert: Montag 8. September 2014, 08:04

Hallo nochmal,

wie bereits gesagt, habt ihr mir sehr geholfen.
Ich habe nun quasi das umgekehrte Problem.

Ich kann nun die einzelnen Wörter aus den Dateien auslesen, will nun aber erstmal die gewünschten Dateien auswählen.
Dazu gebe ich einen Pfad ein und lasse mir mittels

Code: Alles auswählen

os.listdir(directory)
die vorhandenen Dateien anzeigen. Dort sind nun aber auch andere Dateien drin und nicht nur .cfg.
Ich habe jetzt versucht mittels:

Code: Alles auswählen

inventory = os.listdir(directory)
	inventstr = ' '.join(inventory)
	
	print 'Es werden folgende Dateien ausgelesen: ', re.findall(r'(.*?).cfg', inventstr)
die Dateien zu separieren, um danach auf sie zugreifen und auslesen zu können.
Leider funktioniert dies nur mit der .cfg Datei, die an erster Stelle im Ordner kommt, durch die r'()' Syntax. Mir ist bisher keine Lösung eingefallen und ich habe schon einiges probiert. Ich hatte gehofft, durch das Fragezeichen diese lange Kette vermeiden zu können, ist jedoch nicht ganz gelungen.
Die Liste 'inventory' kann ich so scheinbar nicht auslesen. Deshalb konvertiere ich sie in einen string mittels ' '.join(inventory). Dabei dachte ich, dass es wohl sinnvoller ist, wenn zwischen den Dateinamen ein Leerzeichen ist, deshalb beim join das Leerzeichen.
Das klappt aber auch nicht so gut, da dann folgendes raus kommt:

Code: Alles auswählen

['datei1', ' desktop.ini bilder test.txt xdatei2']
Datei1 ist korrekt, aber XDatei2 eben nicht. Ich weiß, dass es an der r'()' Abfrage liegt, weiß aber nicht, wie ich diese so gestalten kann, dass das gewünschte ergebnis dabei heraus kommt.
Kann mir da jemand helfen?

Humpalumpa
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Die Lösung ist auch wieder die selbe wie vorher. Benutze eine for-Schleife über "inventory" und teste dort die Endung. Der Umgang mit so elementaren Datenstrukturen gehört zu den absoluten Grundlagen, dein Ansatz sieht mehr nach Raten aus. Vielleicht solltest du noch einmal das Tutorial in der Pythondokumentation durcharbeiten.

Ansonsten gibt es auch noch das glob-Modul.
Das Leben ist wie ein Tennisball.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@Humpalumpa
`os.listdir()` gibt Dir eine Liste mit den Namen aller Dateien und Verzeichnisse zurück. All diese Namen sind Stringobjekte. Wenn Du also String für String untersuchst, ob dieser mit '.cfg' endet, hast Du am Ende alle relevanten Namen:

Code: Alles auswählen

result = []
for name in os.listdir(dirname):
    if name.endswith('.cfg'):
        result.append(name)
Oder eleganter als List Comprehension:

Code: Alles auswählen

result = [name for name in os.listdir(dirname) if name.endswith('.cfg')]
Auf das Tutorial hab' ich Dich schon hingewiesen, oder? :P

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Humpalumpa hat geschrieben:Denn

Code: Alles auswählen

re.findall(r'threadname="(.*)"','threadname="Worker"')
kann ich nicht nutzen, da ich den string "Worker" nicht kenne und er je nach Datei anders heißt.
Variablen kennst du aber schon, oder?

An der Stelle wo wir den fixen Text stehen haben musst du natürlich den Namen der Variable angeben die den aus der Datei eingelesenen Text enthält.
Antworten