Datei schreiben und lesen

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.
nfehren
User
Beiträge: 98
Registriert: Donnerstag 31. Oktober 2013, 15:11

Servus,
Mein, für mich großes, Projekt ist momentan im Stillstand. Ich habe eine To-do-list programmiert, in die man seine zu erledigenden Sachen reinschreibt. alles schön und gut blos werden die Sachen ja nur kurzeitig im Arbeitsspeicher gespeichert, sobald ich das Programm schließe ist alles wieder weg. Deshalb würde ich gerne wissen wie man in Python 3 eine .txt Datei mit diesen eingetragenen "Issues" beschreiben und wieder einlesen kann. Es wäre nett wenn ihr mir das an einem simplen Beisiel erklärt. Zum Beispiel ein Programm in das meine eine Zahl eingibt und diese dann einfach in einer Textdatei gespeichert wird.
Vielen Dank!
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Ist ja nicht so, dass es nicht im Grundlagentutorial stehen würde ;-) Unter Umständen bietet sich aber auch das SQLite-Modul an, dann musst du dich nicht selbst um mögliche Sonderfälle kümmern (Zeilenumbruch in einer Todo-Beschreibung, Zusatzinformationen zu einem Todo, etc.).
Das Leben ist wie ein Tennisball.
nfehren
User
Beiträge: 98
Registriert: Donnerstag 31. Oktober 2013, 15:11

EyDu hat geschrieben:Hallo.

Ist ja nicht so, dass es nicht im Grundlagentutorial stehen würde ;-) Unter Umständen bietet sich aber auch das SQLite-Modul an, dann musst du dich nicht selbst um mögliche Sonderfälle kümmern (Zeilenumbruch in einer Todo-Beschreibung, Zusatzinformationen zu einem Todo, etc.).
Ist das nicht für Python 2?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Dateihandling sollte in jedem guten Tutorial beschrieben werden! Welches nutzt Du denn zum Lernen?

Ich würde Dir raten, Deine Daten im JSON-Format zu serialisieren. Dafür gibt es das Modul ``json`` in der Standard-Lib, welches einfach zu benutzen ist. Das Format kannst Du in einem Texteditor lesen und bearbeiten.

Da Du Deine "ToDos" ja schon in irgend einer Form von Datenstruktur vorliegen hast, sollte das Hinzufügen dieser Funktionalität recht einfach sein :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

http://docs.python.org/3/tutorial/input ... ting-files

Einfach die 2 in eine 3 ändern in der URL. 8)
BlackJack

Reading and Writing Files im Tutorial in der Python-Dokumentation hast Du schon durchgearbeitet? Interessant dürfte dort auch der Abschnitt Saving structured data with json sein.

Edit: Zu langsam. :(
nfehren
User
Beiträge: 98
Registriert: Donnerstag 31. Oktober 2013, 15:11

Hyperion hat geschrieben:Dateihandling sollte in jedem guten Tutorial beschrieben werden! Welches nutzt Du denn zum Lernen?

Ich würde Dir raten, Deine Daten im JSON-Format zu serialisieren. Dafür gibt es das Modul ``json`` in der Standard-Lib, welches einfach zu benutzen ist. Das Format kannst Du in einem Texteditor lesen und bearbeiten.

Da Du Deine "ToDos" ja schon in irgend einer Form von Datenstruktur vorliegen hast, sollte das Hinzufügen dieser Funktionalität recht einfach sein :-)
Ich benutze "Programming in Python 3" von Mark Summerfield.
Kennst du ein besseres Buch?

Ok danke werd ich gleich mal probieren :)
nfehren
User
Beiträge: 98
Registriert: Donnerstag 31. Oktober 2013, 15:11

Danke für die vielen Antworten ich arbeite mich jetzt durch die Links :P
nfehren
User
Beiträge: 98
Registriert: Donnerstag 31. Oktober 2013, 15:11

Ich habe das jetzt probiert, bekomme jedoch keine ausgabe..

Code: Alles auswählen

#!/usr/bin/python3
import json
json.dumps([1, "simple", "list"])
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Könnte daran liegen, dass du das Ergebnis von ``json.dumps`` gar nicht ausgibst ;-) Wenn du die Daten mit Json in einer Datei abspeichern wilst, dann solltest du auch besser direkt den Weg über ``json.dump`` gehen, dort kannst du zusätzlich ein Dateiobjekt übergeben.
Das Leben ist wie ein Tennisball.
zar1
User
Beiträge: 39
Registriert: Samstag 28. Dezember 2013, 01:08

ich mache das so :

f = open("C:\\important\\Databank.txt","w") # w für write
eingabe = input()
f.write(eingabe)
f.write(" ")
eingabe2 = input()
f.write(eingabe2)
f.close()

das speichert meine daten in dem von mir ausgewählten pfad ab die f.write(" ") zeile ist zum unterscheiden von key und value. Um die Daten dann wieder reinzuladen mache ich das so:

d = {} #dictionary klammern
f =open("C:\\important\\Databank.txt","r") # pfad und read file
for line in f:
(key, val) = line.split() # unterscheiden von key und value
d[key] = val # zuordnung
f.close()


du brauchst eig nur die f =open("C:\\important\\Databank.txt","r") zeile zum reinladen der rest ist dafür gedacht wenn du die daten etwas zuordnen willst wenn du die einfach nur einlesen willst reicht die zeile.
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@zar1: es gibt etliche Pakete in der Standardbibliothek um solche Daten in einem vernünftigen Format zu speichern, da brauchst Du nicht noch etwas eigenes, fehleranfälliges zu schreiben. Je nach Vorlieben gibt es ConfigParser, csv, json, Deine Lösung macht Probleme, wenn jemand Leerzeichen eingibt.
Du solltest Dich hier im Forum übrigens mal nach dem Code-Knopf suchen.
zar1
User
Beiträge: 39
Registriert: Samstag 28. Dezember 2013, 01:08

@Sirius3
zuerst ist das was ich gepostet habe nicht fehleranfällig zumindest funktioniert es bei mir:)

zweitens verstehe ich ncith warum an sich durch ein modul arbeiten muss wenn die lösung in python ohne module schon vorgegeben ist.

und ich rate dir den ganzen quellcode zu lesen den dieses "Leerzeichen" wurde nur zur Abgrenzung gemach tund hat somit keinen weiteren Wert siehe:

for line in f:
(key, val) = line.split()


aber ist nur meine Lösung und es gibt sicher andere bzw. bessere :D
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@zar1: ich kann lesen :twisted:
Teste selbst:

Code: Alles auswählen

>>> eingabe = input()
bla bla
>>> eingabe2 = input()
foo foo
>>> with open('datei.txt', 'w') as output:
...     output.write("{} {}".format(eingabe, eingabe2))
... 
15
>>> d = {}
>>> with open('datei.txt') as lines:
...     for line in lines:
...         (key, val) = line.split()
...         d[key] = val
... 
Traceback (most recent call last):
  File "<stdin>", line 3, in <module>
ValueError: too many values to unpack (expected 2)
>>> 
zar1
User
Beiträge: 39
Registriert: Samstag 28. Dezember 2013, 01:08

okay das kann sein das der nicht mehr als zwei values nimmt den ich hab eig nur ein item gebraucht für mehrere items ist meine Lösung ungeeignet aber wie man das dann macht habe ich keine Idee :D
BlackJack

@zar1: Ich denke Du hast es noch nicht verstanden, es liegt nicht an der Anzahl der Elemente, auch Sirius3 hat da nur *zwei* eingegeben, sondern das bei Deinem Format das Trennzeichen selbst nicht in den Elementen vorkommen darf. Du musst das mindestens vor dem schreiben verhindern, am besten schon bei der Eingabe, sonst ist Dein Programm eben doch fehleranfällig.
nfehren
User
Beiträge: 98
Registriert: Donnerstag 31. Oktober 2013, 15:11

Ok das mit dem einschreiben hat geklappt! :)

Code: Alles auswählen

#!/usr/bin/python3

f = open("f.txt","w")
eingabe = input()
f.write(eingabe)
f.close()
Aber wie kann ich den Inhalt der Datei einzeigen lassen?
so müsste der Code doch anfangen:

Code: Alles auswählen

f = open("f.txt", encoding="utf8")
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

nfehren hat geschrieben:Aber wie kann ich den Inhalt der Datei einzeigen lassen?
Wenn man nach der durchaus recht informativen offiziellen Dokumentation geht, dann könnte man readline verwenden.
nfehren
User
Beiträge: 98
Registriert: Donnerstag 31. Oktober 2013, 15:11

/me hat geschrieben:
nfehren hat geschrieben:Aber wie kann ich den Inhalt der Datei einzeigen lassen?
Wenn man nach der durchaus recht informativen offiziellen Dokumentation geht, dann könnte man readline verwenden.
das ist leider für Python 2 habe Python 3 :?

Edit:
Habe eine gute Doku gefunden
http://www.tutorialspoint.com/python/file_readline.htm

mein Code sieht jetzt so aus:

Code: Alles auswählen

f = open("f.txt","w")
eingabe = input()
f.write(eingabe)
f.close()

f = open("f.txt","r", encoding="utf8")
line = f.readline()
print("Read Line: %s" % (line))
mcdwerner
User
Beiträge: 113
Registriert: Donnerstag 7. Juli 2011, 14:27

der Unterschied zwischen 2 und 3 ist die 2 und die 3 in der URL ;-)
http://docs.python.org/3/library/stdtyp ... e.readline
Antworten