Textdatei richtig auslesen

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
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

ich habe eine Textdatei, die an eine Art Tabelle erinnert. Diese muß ich nun auslesen. Die Textdatei sieht so aus:

Code: Alles auswählen

Vmid                                         Name                                                                                File                                               Guest OS         Version   Annotation
112    10a47231458907458943275894327589347534895743298573429857349587342895743298574389   [datastore1] 10a47231458907458943275894327589/10a47231458907458943275894327589.vmx   winNetStandardGuest   vmx-07              
16     M1                                                                                 [datastore1] M1/M1.vmx                                                               winNetStandardGuest   vmx-07              

Die erste zeile sind nur Überschriften, diese überlese ich natürlich. Ich habe zu erst versucht, die Datei mit dieser Routine aufzusplitten.

Code: Alles auswählen

		# erste zeile ( ueberschriften ueberlesen )
		datei.readline ()
		for z in datei:
			vmid = z[0:7]
			vmname = z[7:19]
			vmfilename = z[32:58]
			
			if str (vmname.strip ()) != str (name.strip ()):
				vmid = 0
			else:
				break
		datei.close ()
		return (vmid)
So weit so gut, rannte das auch, bis das File ( Filename ), in der Tabelle zu lang wurde ( kann ja irgendwann nicht mehr gehen ). Jetzt war meine Idee, immer so weit zu lesen, bis ein Leerzeichen kommt, dann würde wieder alles passen. Aber hat jemand ne Ahnung, wie ich immer bis zum nächsten Lehrzeichen lesen kann?
Gremlin
User
Beiträge: 166
Registriert: Freitag 28. Mai 2010, 23:49

Wie wärs mit str.split?

Code: Alles auswählen

for line in datei:
    if line.startswith('Vmid'):
        continue # Erste Zeile...
    parts = line.split()
    vmid = parts[0]
    vmname = parts[1]
    ...
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

wow, danke sehr. hat auf anhieb geklappt !!! diese methode kannte ich noch gar nicht.

EDIT:
python ist echt verdammt mächtig. da kann man schon mal den überblick verlieren. ich hätte es vermutlich mit einer umständlichen schleife gemacht.
BlackJack

@The Hit-Man: Die Leerzeichen zwischen Funktion und Klammern sind sehr gewöhnungsbedürftig. Und bei ``return`` sind die Klammern unnötig. Wegen den Leerzeichen bei den Funktionsaufrufen könnte hier sogar noch jemand fälschlicherweise auf die Idee kommen ``return`` sei eine Funktion.

Was sollen in der ``if``-Bedingung die `str()`-Aufrufe eigentlich bewirken!? Und der Programmfluss sieht an der Stelle auch sehr undurchsichtig aus!? Soll das etwa die `vmid` zurückgeben falls der `name` gefunden wird und sonst 0? Das könnte man auch etwas weniger umständlich ausdrücken (ungetestet):

Code: Alles auswählen

            with open('dateiname.ext') as lines:
                # erste zeile ( ueberschriften ueberlesen )
                lines.next()
                for line in lines:
                    vm_id, vm_name, dummy, vm_file, dummy = line.split(None, 4)
                    if vm_name == name:
                        return vm_id
            # nicht gefunden
            return 0
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

ich sollte mir echt mal nen anderen programmierstiel beibringen, ich weiß ;)
Antworten