readlines() \n Problem

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
orschiro
User
Beiträge: 60
Registriert: Donnerstag 11. Dezember 2008, 16:10
Kontaktdaten:

Hallo Leute,

mittels folgendem Code lese ich eine Datei ein, um dann eine bestimmte Zeile auszulesen, bzw. die Datei im gleichen Schritt mit auszugeben.

Code: Alles auswählen

content = open("file").readlines()
title = content[1]
Den title liest er auch schön aus, aber der content selbst wird unschön mit \n', ' und falschen Umlauten "Funktionalit\xc3\xa4t gew\xc3\xa4hrleisten k\xc3\xb6nnen." angezeigt.

Gibt es eine Möglichkeit, das abzufangen?

Grüße
...
User
Beiträge: 116
Registriert: Mittwoch 23. Dezember 2009, 20:22

Wie willst du die Datei wieder sauber schließen können?

Code: Alles auswählen

with open("file", 'r') as myfile:
    content = myfile.readlines()

Titel = content[1]
Warum das so eigenartig angezeigt wird, ist weil die Sonderzeichen nicht als solche Interpretiert werden, wenn du das nicht mit print machst.

Code: Alles auswählen

>>>'äöü'
'\x84\x94\x81'
>>>print 'äöü'
äöü
orschiro
User
Beiträge: 60
Registriert: Donnerstag 11. Dezember 2008, 16:10
Kontaktdaten:

In diesem Fall kann ich leider nichts printen, da ich die Variablen einem Template in Bottle zuweise.

Code: Alles auswählen

return template("template", title=title, content=content)
Ach und danke für den Hinweis mit with. So kann man das natürlich noch eleganter lösen. :)
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Das scheint dann ein Dekodierungsproblem zu sein. Was für ein Coding hat denn die eingelesene Datei?

Hinweis: Den gesamten Dateiinhalt auslesen, wenn du nur die erste Zeile benötigst, ist nicht so elegant. Alternative:

Code: Alles auswählen

with open("file", 'r') as myfile:
    for line in myfile:
        title = line
        break
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
BlackJack

@ms4py: Es gibt da ja noch eine `next()`-Methode auf "iterables" wie es Dateiobjekte zum Beispiel sind. Die Schleife ist da eher nicht so schön. Aber der gesamte Inhalt scheint auch noch mal als `content` an das Template übergeben zu werden.

@orschiro: Wo bekommst Du denn diese Anzeige? Wirklich beim Titel oder gibst Du zufällig die Liste vom `content` im Template als Zeichenkette aus?
orschiro
User
Beiträge: 60
Registriert: Donnerstag 11. Dezember 2008, 16:10
Kontaktdaten:

Was für ein Coding hat denn die eingelesene Datei?
Vim sagt mir utf-8.
Den gesamten Dateiinhalt auslesen, wenn du nur die erste Zeile benötigst, ist nicht so elegant. Alternative:
Ich benötige ja nicht nur die erste Zeile, sondern auch den gesamten Inhalt. Nur möchte ich einmal nach Titel und Inhalt unterscheiden, daher noch das zusätzliche Auslesen des Titels, der in der Datei hinterlegt ist.
Wo bekommst Du denn diese Anzeige? Wirklich beim Titel oder gibst Du zufällig die Liste vom `content` im Template als Zeichenkette aus?
Die Ausgabe bekomme ich im Browser. Die eingelesene Datei sieht wie folgt aus:

Code: Alles auswählen

<!-- 
Titel
-->
<p>
Inhalt - Test
</p>
Und die Ausgabe im Browser dann entsprechend:

Code: Alles auswählen

['\n', '

\n', 'Inhalt - Test\n', '

\n'] 
Lese ich den Inhalt hingegen mit read() ein, habe ich dieses Problem nicht. Dann kann ich allerdings aber auch nicht mehr so elegant die Zeile auslesen, in der sich der Titel befindet.
BlackJack

@orschiro: `content` ist eine *Liste* und die darin enthaltenen Zeichenketten, bzw. grundsätzlich Objekte in Listen, werden in der `repr()`-Form ausgegeben. Zeichenkettendarstellungen von Listen sind ja auch eher für den Programmierer interessant und nicht für Endbenutzer von Programmen. Du darfst halt `content` nicht einfach so im Template verwenden, sondern musst aus dem Inhalt wieder eine Zeichenkette machen oder im Template eine Schleife verwenden.
orschiro
User
Beiträge: 60
Registriert: Donnerstag 11. Dezember 2008, 16:10
Kontaktdaten:

Hallo BlackJack,

auf die Idee, im Template eine Schleife einzusetzen, bin ich natürlich mal wieder nicht gekommen.

Aber so lernt man dazu, ich danke dir, es funktioniert einwandfrei. :)

Grüße
Antworten