muss write alles mitschreiben?

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
HugoCaspar
User
Beiträge: 7
Registriert: Montag 22. Februar 2016, 10:14

moin,
ich möchte gerne das "ne" am ende nicht in der liste haben
und das ', ' würde ich gerne durch sowas wie /n ersetzen aber es passt bei mir immer nicht!
giebt es da nich eine elegante lösung oder muss ich alles anders schreiben? :)

Code: Alles auswählen

def speichern():
    datei = open('habeichdatei', mode='a')
    datei.write(', ')
    datei.write(frage)
    datei.close


weiter =True

while weiter:
    frage = (input("Was möchtest du gerne haben?: "))
    speichern()
    if frage == "ne":
        weiter = False
Zuletzt geändert von HugoCaspar am Montag 22. Februar 2016, 20:45, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du musst Dir überlegen, wann Du das Speichern aufrufen willst! Offenbar nur dann, wenn die Abbruchbedingung *nicht* erfüllt ist... sprich, diese musst Du irgend wie zuerst auswerten und nur dann speichern, wenn es noch weitergeht.

Davon abgesehen würde ich auch mit einer Endlosschleife arbeiten und diese mittels ``break`` verlassen. Also so in der Art:

Code: Alles auswählen

while True:
    # wenn irgend eine Bedingung erfüllt:
    break
Und Du solltest den Text an die Funktion ``speichern`` als Parameter übergeben! Funktionen sollten nicht auf globalen Variablen basieren.

Dateien solltest Du immer so öffnen:

Code: Alles auswählen

with open(...) as filehandle:
    # filehandle ist dein offenes Dateiobjekt innerhalb des Blocks
    # es wird *automatisch* geschlossen, auch im Fehlerfalle
    # es ist also kein ``.close`` nötig!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
HugoCaspar
User
Beiträge: 7
Registriert: Montag 22. Februar 2016, 10:14

super...wieder was gelernt!!

Code: Alles auswählen

while True:
    frage = (input("Was möchtest du gerne haben?: "))
    if frage == "ne":
        break
    speichern()
ich habe aber nicht verstanden was du mit filehandle meintest ich habe nur mal as csv gesehen

kann mir auch jemand sagen wie ich das ', ' durch sowas wie /n ersetzen kann?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

``filehandle`` ist einfach ein Name für das Fileobjekt, welches durch ``open`` erzeugt wird. Du kannst es auch ``f``, ``fileobj`` oder ``Schnitzel`` nennen. Man sollte eben immer Namen vergeben, die verdeutlichen, was sich hinter dem Objekt verbirgt. ``Schnitzel`` wäre also kein sinnvoller Name ;-)

Deine letzte Frage habe ich nicht verstanden!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

HugoCaspar hat geschrieben:kann mir auch jemand sagen wie ich das ', ' durch sowas wie /n ersetzen kann?
Indem du statt des ', ' einfach '/n' dort hinschreibst. Vermutlich möchtest du allerdings einen Zeilenumbruch haben und solltest daher '\n' verwenden.
BlackJack

Ich würde dann aber die umgekehrte Reihenfolge empfehlen: Das Zeilenendezeichen sollte am Ende *jeder* Zeile stehen, also nach dem Zeileninhalt geschrieben werden und nicht davor.
HugoCaspar
User
Beiträge: 7
Registriert: Montag 22. Februar 2016, 10:14

so geht es bei mir nicht....das /n wird einfach in die datei geschrieben
ich habe auch schon was von newline=/n gelesen aber das ging, so wie ich das benutzt habe, auch nicht

Code: Alles auswählen

def speichern():
    datei = open('habeichdatei', mode='a')
    datei.write(frage)
    datei.write('/n')
    datei.close
BlackJack

@HugoCaspar: Lies noch mal den Beitrag von /me!

Und am Ende solltest Du die Datei auch wirklich schliessen. Dazu musst Du die `close()`-Methode auch *aufrufen*. Oder noch besser, wie von Hyperion vorgeschlagen, die ``with``-Anweisung verwenden.
pythontester
User
Beiträge: 17
Registriert: Sonntag 21. Februar 2016, 17:08

Hallo,
ich benutze immer \r\n fuer Zeilenumbrueche. Der Uebersichthalber immer als letztes, am Anfang muesstest du pruefen ob die Datei leer ist, sonst hast du eine Leerzeile gleiche zu Beginn.
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

pythontester hat geschrieben:ich benutze immer \r\n fuer Zeilenumbrueche
Und wie wäre es mit os.linesep?
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

HugoCaspar hat geschrieben:so geht es bei mir nicht....das /n wird einfach in die datei geschrieben
Bitte beachte den Unterschied zwischen Slash und Backslash.
pythontester
User
Beiträge: 17
Registriert: Sonntag 21. Februar 2016, 17:08

\r\n wird vom HTTP Protokoll mit erwartet. PHP, C/C++ und ich wage mich zu entsinnen auch Visual Basic erzeugen damit ein Zeilenumbruch. Wieso also alles 3x mal lernen, wenn solche gebraeuchlichen Steuerzeichen, in jeder Sprache vorhanden sind.
BlackJack

@pythontester: Das ist falsch! Denn es gibt Betriebssysteme die verändern die Daten bei Textdateien. Wenn Du unter Windows '\r\n' in eine Textdatei schreibst, dann schreibt Dir Windows tatsächlich '\r\r\n' in die Datei. Umgekehrt macht Windows beim Lesen einer Textdatei aus '\r\n' ein einfaches '\n'. Das ist übrigends auch bei PHP, C, und C++ so. Bei HTTP *sollten* Zeilen zwar mit '\r\n' abgeschlossen werden, unabhängig vom Betriebssystem, allerdings sagt der Standard auch das Implementierungen tolerant sein sollen, also in diesem Fall auch mit '\n' (oder auch mit '\r'!) alleine klar kommen sollten. Zumal man HTTP-Header nicht selber schreibt, das macht das Webrahmenwerk. Also abgesehen von irgendwelchen Low-Level-Protokollen ist '\r\n' zu verwenden eine sehr schlechte Idee.

Auch der Test auf leere Datei ist überflüssig wenn man das Zeilen*ende* am *Ende* schreibt und nicht davor. Was auch noch andere Probleme mit sich bringt, denn wenn man nicht jede Zeile mit einem Zeilenende abschliesst, fallen so einige Werkzeuge auf die Nase die erwarten, dass man Dateien einfach verketten kann in dem man sie direkt hintereinander liest/schreibt. Bei einem fehlenden Zeilenende in der letzten Zeile führt das dazu, dass die letzte Zeile einer Datei und die erste Zeile der nächsten Datei nicht mehr durch dieses Steuerzeichen getrennt sind.
HugoCaspar
User
Beiträge: 7
Registriert: Montag 22. Februar 2016, 10:14

ahh '\'
so funktioniert es ....anfängerfehler....:D

vielen dank ihr habt mir sehr gut geholfen, ohne mir was vorzusagen!
bis zum nächsten mal...
pythontester
User
Beiträge: 17
Registriert: Sonntag 21. Februar 2016, 17:08

Blackjack koenntest du das erlaeutern?

Eine Textdatei unter Windows

Code: Alles auswählen

unsigned AnsiChar data[49] = {
	0x48, 0x61, 0x6C, 0x6C, 0x6F, 0x2C, 0x0D, 0x0A, 0x64, 0x61, 0x73, 0x20, 0x69, 0x73, 0x74, 0x20, 
	0x65, 0x69, 0x6E, 0x65, 0x20, 0x44, 0x61, 0x74, 0x65, 0x69, 0x2E, 0x0D, 0x0A, 0x55, 0x6D, 0x62, 
	0x72, 0x75, 0x65, 0x63, 0x68, 0x65, 0x20, 0x73, 0x69, 0x6E, 0x64, 0x20, 0x64, 0x61, 0x62, 0x65, 
	0x69
};

48616C6C6F2C0D0A646173206973742065696E652044617465692E0D0A556D62727565

Hallo,
das ist eine Datei.
Umbrueche sind dabei
Mit Notepad und Wordpad getestet.

\r\n erzeugte auch 0x0d, 0x0a .

Was ist jetzt an meinem Windows oder meinem Hexeditor falsch?
BlackJack

@pythontester: Ich habe keine Ahnung *was* Du gemacht hast, denn das verschweigst Du ja, aber Du hast nicht '\r\n' in eine Textdatei geschrieben. Kann es sein das Du es in eine Binärdatei geschrieben hast?
pythontester
User
Beiträge: 17
Registriert: Sonntag 21. Februar 2016, 17:08

\n wird in Notepad nicht als neue Zeile angezeigt. In Geany ja.

Code: Alles auswählen

datei = open("test.txt", "w")
    for a in range(1,10):
    	datei.write("Zeile: "+str(a)+"\r\n")
     datei.close
BlackJack

@pythontester: Der Code ist so nicht ausführbar wegen der kaputten Einrückung, und unter Windows produziert der, wenn man die Einrückung korrigiert, eine Datei die zwei Wagenrücklaufzeichen pro Zeilenende enthält, statt einem, wie es (für Windows) korrekt wäre.

Ausser Notepad kann auch unter Windows jeder sinnvoll verwendbare Editor mit den verschiedenen Varianten von Zeilenenden klar kommen.
Antworten