Seite 1 von 1

readlines() \n Problem

Verfasst: Mittwoch 17. März 2010, 13:03
von orschiro
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

Verfasst: Mittwoch 17. März 2010, 13:07
von ...
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 'äöü'
äöü

Verfasst: Mittwoch 17. März 2010, 13:15
von orschiro
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. :)

Verfasst: Mittwoch 17. März 2010, 14:47
von ms4py
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

Verfasst: Mittwoch 17. März 2010, 15:41
von 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?

Verfasst: Mittwoch 17. März 2010, 17:01
von orschiro
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.

Verfasst: Mittwoch 17. März 2010, 17:33
von 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.

Verfasst: Mittwoch 17. März 2010, 18:23
von orschiro
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