beim Auslesen einer Datei kommt Zeilenumbruch ("\n")

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
evd
User
Beiträge: 34
Registriert: Donnerstag 20. Juni 2013, 19:19

Hallo zusammen

Ich habe ne, wahrscheinlich kleinere Frage...

Ich will eine in meinem Programm einen Text aus einer Datei auslesen.
wenn ich sie mir anschaue, hat sie keine Zeilenumbrüche, doch wenn ich

Code: Alles auswählen

self.art = "liste"
self.liste = open("/home/evd/Schreibtisch/python/Amazon/Listen/"+self.art).read()
ausführe kommt bei mir immer ein Zeilenumbruch raus, also

Code: Alles auswählen

Misch#test#\n
(edit: ich habe die "#" als "ende" zeichne einer Eingabe genommen, ergo wurden schon 2 eingaben getätigt)

ist das normal ... was ich bezweifle ...

vielen Dank im Vorhinaus

EvD

ps.: ich habe mal im ganzen Programm nach einem "\n" gesucht, aber ich habe nirgends "\n" stehen :(

(edit: "/" zu "\" gemacht, da verschrieben)
Zuletzt geändert von evd am Mittwoch 20. August 2014, 15:43, insgesamt 2-mal geändert.
BlackJack

@evd: '/n' ist kein Zeilenumbruch sondern zwei Zeichen, ein Schrägstrich gefolgt vom Buchstaben 'n'. Woher weisst Du/willst Du wissen was in `self.liste` tatsächlich enthalten ist. Zu zeigst weder Code wo in die Datei geschrieben wird, noch Code mit dem Du das gelesene anzeigst. Und zwar so dass man genau sehen kann was die Daten (nicht) enthalten, also zum Beispiel die `repr()`-Darstellung.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

evd hat geschrieben:

Code: Alles auswählen

Misch#test#/n
Das ist wieder ein Beispiel dafür wie wichtig es ist echten funktionierende Code, echte Ausgaben und echte Fehlermeldungen anzugeben.

Deine Ausgabe zeigt dir möglicherweise ein \n für einen Zeilenumbruch an, aber definitiv kein /n. Jetzt wäre natürlich noch die Frage, auf welche Art und Weise du dir die Daten denn überhaupt ausgeben lässt.

Code: Alles auswählen

>>> text = 'Hallo\nWelt'
>>> print(text)
Hallo
Welt
>>> print(repr(text))
'Hallo\nWelt'
>>> print([text])
['Hallo\nWelt']
Ist dir hier klar, warum in welchem Fall die jeweilige Ausgabe entsteht?
evd
User
Beiträge: 34
Registriert: Donnerstag 20. Juni 2013, 19:19

ich habe die Datei per Hand erstellt, daher kann ich wissen was in dem Text Dokument geschrieben steht, und der Debuger zeigt mir "self.liste" an...
und jup sorry, habe mich verschrieben, meinte "\n" :)
ich verbessere es gleich mal

naja, wie gesagt, ich kann zwar das Posten, wo was geschrieben wird, aber bis dahin komme ich gar nicht. ich habe die ersten eingaben (aus Testzwecken) per Hand eingegeben, und dann das Programm bis dahin laufen lassen. ergo habe ich nicht mehr als ein Klassenaufruf, in der (in def __init__) in den ersten beiden zielen das steht (’self.art = "liste"’ ist als Variable definiert, aber da die Datei gefunden wird, kann darin nicht der Fehler liegen)

@me
ja, es ist mir bewusst :)
ich lasse ihn mir nicht ausgeben(zumal das bei nichts zeigen würde wenn ich "hallo welt \n" ausgen lassen würde, sieht man ja nicht den Absatz), und eine Fehlermeldung bekomme ich auch nicht, zumindest nicht dort, sondern viel weiter hinten, wenn ich den text auslesen will, den ich bearbeitet habe, weil er nichts mit Zeilenumbrüchen anfangen kann. aber die Fehlerquelle ist dort, weil ich ja dort die Zeilenumbrüche rein wurstele, durch

Code: Alles auswählen

self.liste_schreiben = open("/home/evd/Schreibtisch/python/Amazon/Listen/" + self.art, "w")
self.liste2 = self.liste, "hallo")
self.liste_schreiben.write(self.liste2)
Zuletzt geändert von evd am Mittwoch 20. August 2014, 15:21, insgesamt 1-mal geändert.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Naja, irgendwo wird der Fehler wohl liegen. Wenn du aber werde Code noch den genauen Dateiinhalt zeigen willst, dann kann man dir schlecht helfen. Das würde nur in sinnloses Raten übergehen.
Das Leben ist wie ein Tennisball.
evd
User
Beiträge: 34
Registriert: Donnerstag 20. Juni 2013, 19:19

der genau Dateiinhalt ist, wie gesagt "Misch#test#" und das, zumindest in meinem Texteditor volkommen ohne Zeilenumbruch.
der Code, (bis zu dem Fehler, an dem ich dann hinten noch ein \n bekomme) lautet wie folgt

Code: Alles auswählen

import sys,os
from PyQt4 import QtGui, QtCore, uic

class start(QtGui.QDialog):
    def __init__(self):
        super(start, self).__init__()
        self.ui = uic.loadUi('start.ui', self)
        self.ui.show()
        self.pb_sta_lsb.clicked.connect(self.bearbeiten)
        self.pb_sta_ips.clicked.connect(self.int_suche)
        self.pb_sta_lis.clicked.connect(self.List_suche)
    def int_suche(self):
        self.ui.close()
        Interpreten_Suche()
    def List_suche(self):
        self.ui.close()
        List_suche()
    def bearbeiten(self):
        self.ui.close()
        Listen_Bearbeiten()

class Listen_Bearbeiten(QtGui.QDialog):
    def __init__(self):
        super(Listen_Bearbeiten, self).__init__()
        self.vonwo= 0
        self.ui = uic.loadUi('Listen_Bearbeiten.ui', self)
        self.ui.show()
        self.pb_lsb_zuruck.clicked.connect(self.zuruck)
        self.art = "listen"
        self.aListenverwalter = Listenverwalter(self.art)
.
.
.

class Listenverwalter():
    def __init__(self, part):
        self.art = part
        self.liste = open("/home/evd/Schreibtisch/python/Amazon/Listen/"+self.art).read()
.
.
.

def main():
    app = QtGui.QApplication(sys.argv)
    start()
    exit(app.exec_())

main()
das ist alles wichtige, und self.liste lasse ich mir über den debugger ausgeben, also kein Ausgabebefehl
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Wie sieht denn die Ausgabe von ``print(repr(self.liste))`` aus?
Das Leben ist wie ein Tennisball.
evd
User
Beiträge: 34
Registriert: Donnerstag 20. Juni 2013, 19:19

'Misch#test#\n'
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Dann wird wohl ein Zeilenumbruch in der Datei sein. Wie groß ist diese denn (in Bytes)?
Das Leben ist wie ein Tennisball.
evd
User
Beiträge: 34
Registriert: Donnerstag 20. Juni 2013, 19:19

dachte ich auch schon, aber wenn ich in einem normalen Textbearbeitungsprogramm dad janze lade, habe keinen Umbruch ...

12 Bytes ist es groß
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Dann belügt dich dein Editor oder du hast ihn falsch eingestellt. 'Misch#test#\n' sind genau 12 Bytes. In der Datei befindet sich also ein Newline.
Das Leben ist wie ein Tennisball.
evd
User
Beiträge: 34
Registriert: Donnerstag 20. Juni 2013, 19:19

darf ich das bezweifeln, denn selbst wenn ich ein neue Datei anlege, und dort genau das reinschreibe (nicht kopiere, schreibe) habe ich auch 12 Bytes ...
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Und, weißt du was der Editor im Hintergrund macht? Schreib die Datei doch mal mittels

Code: Alles auswählen

echo -n "Misch#test#" > spam.txt
Das Leben ist wie ein Tennisball.
BlackJack

@evd: Du darfst das gerne bezweifeln, aber wenn man einfach mal zählt:

Code: Alles auswählen

In [36]: for i, character in enumerate(text, 1):
   ....:     print i, repr(character)
   ....: 
1 'M'
2 'i'
3 's'
4 'c'
5 'h'
6 '#'
7 't'
8 'e'
9 's'
10 't'
11 '#'
Wenn Deine Datei also 12 Bytes lang ist, dann *muss* da ja noch irgendwas anderes als diese Zeichen drin sein. Zum Beispiel ein Zeilenende-Zeichen. Viele Editoren fügen das auch am Ende beim Speichern automatisch ein sofern man das nicht in den Einstellungen deaktiviert. Denn normalerweise möchte man so ein Zeichen am Ende haben.
evd
User
Beiträge: 34
Registriert: Donnerstag 20. Juni 2013, 19:19

ja ...
ja, ich gebe mich geschlagen ....

was ein klump : /

aber danke noch mal für eure schnelle Hilfe :)
Hellstorm
User
Beiträge: 231
Registriert: Samstag 22. Juni 2013, 15:01

Im Zweifelsfall kannst du dir die Datei auch einfach mit einem Hex-Editor anschauen. Da siehst du dann hundertprozentig genau, was in der Datei drin steht, ohne dass der Editor dir da irgend etwas verbirgt, wie ein Byte Order Mark am Anfang oder ein Zeilenumbruch am Ende. Und du siehst auch genau ob es ein LF-Zeilenumbruch oder ein CRLF-Zeilenumbruch ist.

Ohne Zeilenumbruch:

Code: Alles auswählen

4D 69 73 63 68 23 74 65 73 74 23
Mit Zeilenumbruch (Unix):

Code: Alles auswählen

4D 69 73 63 68 23 74 65 73 74 23 0A
Mit Zeilenumbruch (Windows):

Code: Alles auswählen

4D 69 73 63 68 23 74 65 73 74 23 0D 0A
Mit Byte Order Mark + Zeilenumbruch Windows:

Code: Alles auswählen

EF BB BF 4D 69 73 63 68 23 74 65 73 74 23 0D 0A
An druckbaren Zeichen (also nicht-Whitespace) ist das alles gleich und auf den ersten Blick sieht es im Texteditor auch gleich aus, aber im Hex-Editor ist es doch völlig unterschiedlich.
Antworten