Entfernen von Zeilenumbrüchen

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
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

Hallo,

Ich habe eine m3u datei die ich auslese und weiter verarbeite.

Code: Alles auswählen

def test():
	fileToSearch = 'E:/playlist.m3u'
	datafile = file(fileToSearch)

	for line in datafile:
		_title = re.search('Title \d', line)
		if _title is not None:
			title = line.split('-')
			track = (str(title[1]))[2:-1]
			title = (title[2])
			print title
nun tauchen aber "zeilenumbrüche" nach jedem title auf.
Kann ich diese irgendwie sichtbar machen?

folgende sachen habe ich probiert, klappt aber nicht...

Code: Alles auswählen

title = (str(title[2]))[1:-1]

Code: Alles auswählen

title=title.replace("/n", "")
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

sveni_lee hat geschrieben: Mittwoch 27. Februar 2019, 08:43

Code: Alles auswählen

title=title.replace("/n", "")
Das Escape-Zeichen ist der Backslash. Damit ist ein Zeilenumbruch nicht "/n", sondern "\n".

Du könntest auch strip verwenden um alle Whitespace-Zeichen am Beginn und Ende des Strings zu entfernen.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Zeilen enden halt immer mit einem Zeilenumbruch. Den mußt Du doch einfach nur entfernen, was klappt denn an dem, was Du versucht hast genau nicht?
Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht Tabs. Dateien öffnet man üblicherweise mit `open`, nicht `file`. Variablen, die mit einem Unterstrich beginnen, bedeuten, dass man sie nicht verwendet, bei Dir ist das aber der Fall, also gehört _ weg. title ist bereits eine Liste von Strings, da ein Element nochmal in einen String zu verwandeln ist unsinnig. Wie sehen denn Deine Zeilen üblicherweise aus, und warum, wenn Du schon reguläre Ausdrücke benutzt, nutzt Du sie nicht auch um die Aufspaltung zu machen?

Code: Alles auswählen

PLAYLIST = 'E:/playlist.m3u'

def test(playlist):
    with open(playlist):
        for line in datafile:
            match = re.match('^.*?-..(.*?).-(.*Title \d.*)\n', line)
            # oder: match = re.match('^.*?Title \d.*?-..(.*?).-(.*)\n', line)
            # oder besser noch genau das Muster, das die Zeilen tatsächlich haben
            if match is not None:
                track, title = match.groups()
                print title
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

vielen Dank...

mit alle 3 Vorschläge finktionieren problemlos...

Ich habe mich für strip entschieden...
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@sveni_lee: Ein literales Zeilenende ist '\n' und nicht '/n'. Ich würde das mit `rstrip()` entfernen.

Eingerückt wird mit vier Leerzeichen pro Ebene. *Nicht* mit Tabulatorzeichen!

Namen werden klein_mit_unterstrichen geschrieben. Ausnahmen: Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).

Man sollte langsam aber sicher auf Python 3 umsteigen. Und bei Python 2 schon mal anfangen so zu schreiben das die Portierung einfacher wird. Zum Beispiel den `__future__`-Import machen, der aus der ``print``-Anweisung die `print()`-Funktion macht.

Auch in Python 2 ist `file` nicht zum öffnen von Dateien gedacht, dafür gibt es `open()`. In Python 3 gibt es `file` auch gar nicht mehr.

Dateien die man öffnet, sollte man auch wieder schliessen. Wenn möglich sollte man dazu die ``with``-Anweisung verwenden. Auch wieder um das für Python 3 einfacher zu machen sollte man `io.open()` anstelle von `open()` verwenden.

Lokale Namen mit einem führenden Unterstrich bedeuten üblicherweise das der Name nicht verwendet wird. `_title` wird aber verwendet.

Wenn man Backslashes in literalen Zeichenketten ausserhalb von Escape-Sequenzen verwendet, sollte man die entweder durch einen weiteren Backslash escapen, oder ein ”rohes” Zeichenkettenliteral verwenden.

`str()` auf eine Zeichenkette angewendet hat genau *gar keinen* Effekt. Das ist ja bereits eine Zeichenkette.

Wenn man da am Ende drei Teile aus der Zeile haben möchte, sollte man das aufteilen auf zwei Trennungen beschränken. Aber selbst dann ist ein '-' kein gutes/robustes Trennmerkmal. Kann ja auch im Künstler- oder Albumnamen oder im Titel selbst auftauchen.

Ungetestet:

Code: Alles auswählen

def test():
    playlist_filename = 'E:/playlist.m3u'
    
    with io.open(playlist_filename, encoding='cp1251') as lines:
        for line in lines:
            match = re.search(r'Title \d', line)
            if match:
                _, track, title = (part.strip() for part in line.split('-', 2))
                print('Track:', track)
                print('Title:', title)
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
Perlchamp
User
Beiträge: 172
Registriert: Samstag 15. April 2017, 17:58

Frage:
hätte es das *end*-Argument in der print()-Anweisung nicht auch getan ?

Code: Alles auswählen

print('Titel:', titel, end ='')
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Perlchamp: Das kommt drauf an ob man gerne saubere Daten hat. Das Zeilenende ist nun mal kein Bestandteil des Titels/Dateinamens, also sollte das IMHO auch nicht in dem Wert vorhanden sein der an den Namen `titel` gebunden wird.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ja, doch die Verarbeitung der gelesenen Daten macht es sinnvoller, die zu prae-prozessieren durch stripping. Die Daten im Programm sollten "sauber" sein, und newlines sind dann eine Frage der Ausgabe.
Benutzeravatar
Perlchamp
User
Beiträge: 172
Registriert: Samstag 15. April 2017, 17:58

@ _blckjack_ & _deets_ :
ok, verstehe ich, danke euch beiden !
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
Antworten