Seite 1 von 2
Python 2 bestimmte Zeilen lesen?
Verfasst: Mittwoch 17. Dezember 2014, 07:51
von MrRatlos
Ich möchte aus einem Textdokument bestimmte Zeilen auslesen. Dabei kann ich die Buchstaben aber nicht Zählen, da die Länge der Zeilen variiert. :K
Mfg
MrRatlos
Re: Python 2 bestimmte Zeilen lesen?
Verfasst: Mittwoch 17. Dezember 2014, 08:00
von cofi
Willkommen im Forum!
Wie bestimmst du denn die relevanten Zeilen? Und wo genau ist das Problem?
Momentan kann man dir nur sagen, dass das definitiv vielleicht moeglich ist.
Re: Python 2 bestimmte Zeilen lesen?
Verfasst: Mittwoch 17. Dezember 2014, 08:12
von Sirius3
@MrRatlos: Zeilen werden normalerweise auch durch Zeile-Ende-Zeichen gekennzeichnet, da ist es also egal, ob sie unterschiedlich lang sind. Dateien werden in Python sogar automatisch Zeilenweise gelesen, wenn Du über ein File-Objekt iterierst. Du mußt nur noch das Kriterium finden, das bestimmte Zeilen von nicht-bestimmten unterscheidet.
Re: Python 2 bestimmte Zeilen lesen?
Verfasst: Mittwoch 17. Dezember 2014, 08:41
von MrRatlos
Ja ich habe eine Musikliste habe, von der ich nur die Titel.mp3, nicht die anderen Informationen lesen möchte(wie Album, Genre,etc.). Dadurch variiert auch der Zeilenabstand zwischen den Titeln.

Re: Python 2 bestimmte Zeilen lesen?
Verfasst: Mittwoch 17. Dezember 2014, 08:43
von MrRatlos
Das sieht so aus:
info_end
song_begin: Feuer.mp3
Time: 208
Title: Feuer
Genre: 152
mtime: 1402337320
song_end
song_begin: Himmelskind.mp3
Time: 213
Title: Himmelskind
Genre: 152
mtime: 1402337330
song_end
song_begin: Liebe.mp3
Time: 259
Title: Liebe
Genre: 152
mtime: 1402337342
song_end
song_begin: Mmmh.mp3
Time: 300
Title: Mmmh
Genre: 152
mtime: 1402337350
song_end
song_begin: Revulotion.mp3
Time: 266
Title: Revulotion
Genre: 152
mtime: 1402337370
song_end
song_begin: Seemann.mp3
Time: 175
Title: Seemann
Genre: 152
mtime: 1402337406
song_end
song_begin: As I Lay Dying - 94 hours.mp3
Time: 190
Artist: As I Lay Dying
AlbumArtist: As I Lay Dying
Title: 94 Hours
Album: Frail Words Collapse
Track: 1
Date: 2003
Genre: Other
Composer: As I Lay Dying
Disc: 1/1
mtime: 1407013112
song_end
song_begin: Forever.mp3
Time: 282
Artist: As I Lay Dying
AlbumArtist: As I Lay Dying
Title: Forever
Album: Frail Words Collapse
Track: 5
Date: 2006
Genre: Other
Composer: T. Lambesis
Disc: 1/1
mtime: 1407013112
song_end
song_begin: Dreamland.mp3
Time: 342
Artist: Hammerfall
AlbumArtist: Hammerfall
Title: Dreamland
Album: Legacy of Kings
Track: 4
Date: 1998
Genre: Rock
Composer: Jesper Strömblad/Joacim Cans/Oscar Dronjak
Disc: 1/1
mtime: 1405777370
song_end
song_begin: Starchild.mp3
Time: 475
Artist: Wintersun
AlbumArtist: Wintersun
Title: Starchild
Album: Wintersun
Track: 6
Date: 2004
Genre: Metal
Composer: Jari Mäenpää
Disc: 1/1
mtime: 1404309276
song_end
Re: Python 2 bestimmte Zeilen lesen?
Verfasst: Mittwoch 17. Dezember 2014, 08:55
von Sirius3
@MrRatlos: wie schon geschrieben, die Zeilenlänge ist kein Problem, um das Du Dich kümmern müßtest. Was hast Du also schon ausprobiert? Welcher Code macht welche Probleme, die Du auf die Zeilenlänge zurückzuführen glaubst?
Re: Python 2 bestimmte Zeilen lesen?
Verfasst: Mittwoch 17. Dezember 2014, 09:11
von MrRatlos
Code: Alles auswählen
M = open("/var/lib/mpd/tag_cache").read()
print M[5:100]
So hab ich es schon mal versucht. Aber es sind ja nur die einzelnen Buchstaben, die er ausgibt.
Re: Python 2 bestimmte Zeilen lesen?
Verfasst: Mittwoch 17. Dezember 2014, 09:15
von EyDu
Arbeite doch erstmal das
Tutorial durch. Dir fehlt einfach das Grundlagenwissen. Wenn du das drauf hast, dann bekommst du dein Problem sicher gelöst.
Re: Python 2 bestimmte Zeilen lesen?
Verfasst: Mittwoch 17. Dezember 2014, 16:43
von mutetella
@MrRatlos
Mal zwei Dinge, mit denen Du schon mal experimentieren kannst:
- Über ein fileobject kann man iterieren:
Code: Alles auswählen
>>> any_file = open('test')
>>> for line in any_file:
... print line,
...
zeile 1
zeile 2 zeile 2
zeile 3 zeile 3 zeile 3
- Es gibt verschiedene string methods, die einem so manche Arbeit abnehmen:
Code: Alles auswählen
>>> 'this is a string ending with xxxx.mp3'.endswith('mp3')
True
mutetella
P.S. Das von EyDu verlinkte Tutorial gibt es auch
in deutsch.
Re: Python 2 bestimmte Zeilen lesen?
Verfasst: Mittwoch 17. Dezember 2014, 16:59
von snafu
Als erster Ansatz:
Code: Alles auswählen
with open(dateipfad) as lines:
for line in lines:
if line.startswith('song_begin:'):
song_title = line.lstrip('song_begin: ').rstrip('\n')
print(song_title)
Jetzt muss man nur noch verstehen, was da passiert.

Re: Python 2 bestimmte Zeilen lesen?
Verfasst: Mittwoch 17. Dezember 2014, 17:10
von Sirius3
@snafu: vorsicht, lstrip macht nicht das, was Du denkst!
Code: Alles auswählen
>>> line='song_begin: going_nowhere.mp3'
>>> line.lstrip('song_begin: ')
'where.mp3'
Re: Python 2 bestimmte Zeilen lesen?
Verfasst: Mittwoch 17. Dezember 2014, 17:30
von mutetella
Wenn die Daten verlässlich sind, wäre eine Möglichkeit:
Code: Alles auswählen
>>> 'song_begin: going_nowhere.mp3'[12:].rstrip('\n')
'going_nowhere.mp3'
mutetella
Re: Python 2 bestimmte Zeilen lesen?
Verfasst: Mittwoch 17. Dezember 2014, 17:45
von BlackJack
@mutetella: Auf verlässliche Daten sollte man sich IMHO nicht verlassen.

Zumal: Was heisst verlässlich? Man muss ja sowieso prüfen um die Zeilen heraus zu finden die mit diesem Präfix anfangen. Also wird das wohl eher so aussehen:
Code: Alles auswählen
if line.startswith(SONG_FILENAME_PREFIX):
filename = line[len(SONG_FILENAME_PREFIX):].rstrip()
Re: Python 2 bestimmte Zeilen lesen?
Verfasst: Mittwoch 17. Dezember 2014, 18:42
von mutetella
@BlackJack
Hmm... ich kann jetzt ehrlich gesagt keinen Unterschied erkennen... außer dass mein Beispiel hardcoded ist. Zumal der immer wiederkehrende Aufruf von ``len()`` doch kaum nötig sein dürfte. Darum meinte ich ja "... verlässlich ...". Wenn man sich nicht darauf verlassen kann, dass die Zeile, die den Filename enthält, mit 'song_begin: ' beginnt, dann funktioniert ja der ganze Ansatz nicht...
Oder?
mutetella
Re: Python 2 bestimmte Zeilen lesen?
Verfasst: Mittwoch 17. Dezember 2014, 19:05
von BlackJack
@mutetella: Ich bei bei „die Daten” von den Zeilen ausgegangen, nicht nur von denen die den Dateinamen enthalten. Und das hardcoden einer magischen Zahl ist IMHO *deutlich* schlimmer als ein `len()`-Aufruf pro Dateiname. *Falls* das zu langsam ist, kann man es ja immer noch ändern — in eine Konstante — aber es ist halt robust was Änderungen angeht und man kann sich nicht verzählen.
Re: Python 2 bestimmte Zeilen lesen?
Verfasst: Mittwoch 17. Dezember 2014, 20:44
von darktrym
Wenn man nach Clean Code programmieren will, ist BJ Lösung stets zu bevorzugen, robust und selbsterklärend.
Re: Python 2 bestimmte Zeilen lesen?
Verfasst: Donnerstag 18. Dezember 2014, 08:07
von mutetella
BlackJack hat geschrieben:Und das hardcoden einer magischen Zahl ist IMHO *deutlich* schlimmer...
Nochmals: Mit meinem Konsolenbeispiel wollte ich MrRatlos lediglich eine Möglichkeit aufzeigen, wie er an den filename kommt. Natürlich würde das *so* nicht in den Programmcode gehören...
Wie auch immer, ich würde der ``startswith`` Lösung eine mit ``endswith`` vorziehen:
Code: Alles auswählen
def endswith_(text, endings):
for ending in endings:
if text.endswith(ending):
return True
return False
def get_filename(text, extensions):
if endswith_(text, extensions):
return text.split(':')[-1].strip()
Code: Alles auswählen
>>> line = 'song_begin: As I Lay Dying - 94 hours.mp3'
>>> get_filename(line, ('ogg', 'flac', 'mp3', 'wmv'))
'As I Lay Dying - 94 hours.mp3'
mutetella
Re: Python 2 bestimmte Zeilen lesen?
Verfasst: Donnerstag 18. Dezember 2014, 09:02
von BlackJack
@mutetella: Das ist doch dann gar nicht mehr eindeutig und würde auch Sachen erwischen die gar keine Dateinamen sind oder zumindest nicht in der Zeile stehen die hier gewünscht ist, nämlich die, die mit 'song begin: ' anfangen. Auf der anderen Seite werden eventuell Dateinamen nicht gefunden wenn sie andere Endungen haben als in der Liste stehen. Das schliesst sogar andere Schreibweisen mit ein von Endungen die in der Liste stehen wie 'Wav' oder 'MP3'. Es gibt aber noch 'mod', 'it', 'mid', 'midi', 'rmi', 'xm', 'ape', 'wma', 'mp4', 'mpa', 'aac', und was weiss ich noch für Endungen für Audiodateien.
Ausserdem sollte man auch den Punkt prüfen denn sonst werden auch Felder als Dateinamen ausgelesen die gar keine sind, wie zum Beispiel ein Kommentar 'Ad jingle of Aflac'.
`endswith_()` ist überflüssig — `str.endswith()` kann das bereits.
Das Aufteilen an Doppelpunkten wird falsche Ergebnisse liefern wenn mindestens ein Doppelpunkt im Dateinamen enthalten ist.
Re: Python 2 bestimmte Zeilen lesen?
Verfasst: Donnerstag 18. Dezember 2014, 09:20
von mutetella
BlackJack hat geschrieben:... zumindest nicht in der Zeile stehen die hier gewünscht ist, nämlich die, die mit 'song begin: ' anfangen.
Eben. Da sind wir wieder bei den "verlässlichen" Daten. Ich denke, beim Dateiname einer Audiodatei kann man sich eher darauf verlassen, dass dieser eine "Audioextension" hat als darauf, dass die Zeile mit 'song_begin:' beginnt.
BlackJack hat geschrieben:Auf der anderen Seite werden eventuell Dateinamen nicht gefunden wenn sie andere Endungen haben als in der Liste stehen.
Stimmt. Die Liste ist letztlich entscheidend.
BlackJack hat geschrieben:Ausserdem sollte man auch den Punkt prüfen denn sonst werden auch Felder als Dateinamen ausgelesen die gar keine sind, ...
Ok, noch ein Punkt für Dich!
BlackJack hat geschrieben:`endswith_()` ist überflüssig — `str.endswith()` kann das bereits.
Och Menno, dass Python immer alles können muss...
BlackJack hat geschrieben:Das Aufteilen an Doppelpunkten wird falsche Ergebnisse liefern wenn mindestens ein Doppelpunkt im Dateinamen enthalten ist.
Gut, Du hast gewonnen! ``startswith`` ist wohl tatsächlich sinnvoller...
mutetella
Re: Python 2 bestimmte Zeilen lesen?
Verfasst: Donnerstag 18. Dezember 2014, 09:26
von BlackJack
@mutetella: Also ich hatte das so verstanden das das ein vorgegebenes Dateiformat ist und das eben genau die Zeilen gewünscht sind, die mit 'song_begin: ' anfangen. Das sieht nach dem Playlistenformat vom mpd (music player daemon) aus.