Seite 1 von 1
muss write alles mitschreiben?
Verfasst: Montag 22. Februar 2016, 20:34
von HugoCaspar
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
Re: muss write alles mitschreiben?
Verfasst: Montag 22. Februar 2016, 20:42
von Hyperion
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!
Re: muss write alles mitschreiben?
Verfasst: Montag 22. Februar 2016, 21:06
von HugoCaspar
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?
Re: muss write alles mitschreiben?
Verfasst: Montag 22. Februar 2016, 22:46
von Hyperion
``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!
Re: muss write alles mitschreiben?
Verfasst: Montag 22. Februar 2016, 23:54
von /me
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.
Re: muss write alles mitschreiben?
Verfasst: Dienstag 23. Februar 2016, 00:20
von 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.
Re: muss write alles mitschreiben?
Verfasst: Dienstag 23. Februar 2016, 01:58
von HugoCaspar
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
Re: muss write alles mitschreiben?
Verfasst: Dienstag 23. Februar 2016, 08:50
von 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.
Re: muss write alles mitschreiben?
Verfasst: Dienstag 23. Februar 2016, 10:28
von pythontester
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.
Re: muss write alles mitschreiben?
Verfasst: Dienstag 23. Februar 2016, 11:09
von /me
pythontester hat geschrieben:ich benutze immer \r\n fuer Zeilenumbrueche
Und wie wäre es mit
os.linesep?
Re: muss write alles mitschreiben?
Verfasst: Dienstag 23. Februar 2016, 11:12
von /me
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.
Re: muss write alles mitschreiben?
Verfasst: Dienstag 23. Februar 2016, 11:27
von pythontester
\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.
Re: muss write alles mitschreiben?
Verfasst: Dienstag 23. Februar 2016, 11:33
von 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.
Re: muss write alles mitschreiben?
Verfasst: Dienstag 23. Februar 2016, 14:06
von HugoCaspar
ahh '\'
so funktioniert es ....anfängerfehler....
vielen dank ihr habt mir sehr gut geholfen, ohne mir was vorzusagen!
bis zum nächsten mal...
Re: muss write alles mitschreiben?
Verfasst: Dienstag 23. Februar 2016, 14:08
von pythontester
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?
Re: muss write alles mitschreiben?
Verfasst: Dienstag 23. Februar 2016, 14:27
von 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?
Re: muss write alles mitschreiben?
Verfasst: Dienstag 23. Februar 2016, 14:45
von pythontester
\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
Re: muss write alles mitschreiben?
Verfasst: Dienstag 23. Februar 2016, 15:20
von 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.