In txt Datei schreiben

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
Benutzeravatar
oreagel
User
Beiträge: 9
Registriert: Donnerstag 18. Dezember 2014, 19:47

Hallo,
ich melde mich mit einem neuen Problem.

Im Moment habe ich sehr viel mit Daten zu tun, da ich immer wieder Kontaktdaten aufnehmen muss. (Name, Adresse etc)

Nun, mein Programm soll folgende Sachen erledigen:

1. Einzeln Name etc. abfragen
2. Alles in eine Liste packen
3. Diese Liste in eine Textdatei schreiben


Jetzt möchte ich kurz zeigen wie das dann aussieht;

1. Namen etc. eingeben und 2. In Liste packen:

Code: Alles auswählen

name = input("Geben Sie den Namen ein: ")
liste.append("Name: ")
liste.append(name)
Am Schluss habe ich dann alle möglichen Daten in dieser Liste.
Nun kommt mein Problem, nämlich 3.;"Liste in Textdatei schreiben".

Ich weiß dass das im Grunde so auszusehen hat:

Code: Alles auswählen

fout=open("file.txt","w")
    fout.write(bla)
    fout.close
Ich muss diese Liste in einen String umwandeln, da mir sonst fout.write() Ärger macht:
Mein Ansatz:

Code: Alles auswählen

listenstring = ",".join(liste)
Eingefügt in den Code oben:

Code: Alles auswählen

fout=open("file.txt","w")
fout.write(listenstring)
fout.close
Führe ich das ganze nun aus, erstellt mir mein Skript schön brav eine Textdatei mit dem Namen file.txt, diese bleibt aber leider leer.

Kann mir da jemand helfen? Ich hab schon viel ausprobiert und ich möchte nun wirklich keine 100 Kundendaten am Tag von Hand in eine neue Datei schreiben.

greetz
BlackJack

@oreagel: Du musst die Datei auch schliessen. Dazu musst Du die `close`-Methode nicht nur vom Dateiobjekt holen sondern auch *aufrufen*. Noch besser wäre es die Datei mit der ``with``-Anweisung zusammen zu öffnen und damit das Schliessen der Datei frei Haus zu bekommen wenn der Programmfluss den ``with``-Block verlässt.

Warum steckst Du 'Name: ' als jedes zweite Element in die Liste? Dir ist klar wie das Ergebnis dann aussieht wenn Du diese Listenelemente mit Kommas zusammenfügst? Ich kann mir kaum Vorstellen das das so sein soll.

Ich sehe hier jetzt auch nicht wirklich den Vorteil des Programms. Ob Du nun 100 Namen mit dem Programm eingibst, oder 100 Namen mit einem Texteditor in eine Textdatei schreibst, nimmt sich nicht viel. Die meisten Texteditoren bieten wahrscheinlich mehr Komfort beim Bearbeiten und Autovervollständigung für Namen die schon mal vorgekommen.
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Ich gehe hier nur auf den Teil ein, der offensichtlich nicht funktioniert. Der Rest ist sicherlich auch noch mal überdenkbar, aber das ist dann Erfahrungssache (Art des Speichers, etc...)

Um ganz normal in eine Textdatei zu schreiben würde ich open zusammen mit with verwenden.

Code: Alles auswählen

with open("/tmp/test.txt", "w") as f:
    f.write("Dies steht in der Datei")
Benutzeravatar
oreagel
User
Beiträge: 9
Registriert: Donnerstag 18. Dezember 2014, 19:47

@BlackJack

"Name:" ist nicht jedes zweite Element in der Liste, es ist nur ein Beispiel gewesen, natürlich wird das fortgeführt mit "Geb.Datum:" etc. :D

Was meinst du genau mit "aufrufen"? fout.close("file.txt")?


@sparrow

Danke dafür, dein Codeschnipsel funktioniert, aber wieso tut es meiner nicht? Ich weiß dass das was ich hier fabriziere nicht von höchster Effizienz und Qualität ist, aber das muss es auch gar nicht, da ich mich nicht hauptberuflich mit Python beschäftige, sondern mich nur mal dran setze wenn es was zu erledigen gibt :)
BlackJack

@oreagel: Fast richtig, allerdings erwartet `close()` kein Argument. Welchen Namen das Dateiobjekt hat ist zum Schliessen der Datei ja nicht wichtig beziehungsweise kennt das Dateiobjekt den Namen ja schon.

Zu jedem Datensatz immer wieder die Feldbezeichner zu schreiben ist äusserst redundant. In so einem einfachen Format würde man das nicht machen. Da würde man eher eine CSV-Datei schreiben mit den Feldbezeichnern *einmal* als Kopfzeile gefolgt von den Datensätzen. Für CSV-Dateien gibt es in der Standardbibliothek ein Modul das einem einiges an Kopfschmerzen bei Sonderfällen abnimmt. Zum Beispiel können die Feldtrenner ja auch innerhalb der Felder vorkommen. Bei einem einfachen ``','.join(…)`` bekommt man dann Probleme das später wieder sauber zu trennen beim einlesen. Mit CSV-Dateien ist das dagegen kein Problem.
Benutzeravatar
oreagel
User
Beiträge: 9
Registriert: Donnerstag 18. Dezember 2014, 19:47

Ich melde mich zurück mit einem neuen Problem:

Ich habe es jetzt mit with gelöst, aber ich möchte dass jedes mal eine neue Textdatei gespeichert wird, und zwar mit dem Namen als Dateiname. ( Also quasi name".txt")
Jedoch lässt mich open keine Variablen als Dateinamen angeben.
Wie kann ich das lösen? Kann man das überhaupt so gestalten?
BlackJack

@oreagel: Bei `open()` kann man für die Argumente, wie bei jedem anderen Funktionaaufruf auch, beliebige Ausdrücke angeben die zu einem passenden Wert ausgewertet werden. Falls Du da wirklich ``name".txt"`` geschrieben hast, dann ist das keine gültige Python-Syntax. Du musst schon eine Operation da hin schreiben die aus dem Wert von `name` und der literalen Zeichenkette ".txt" eine Zeichenkette erstellt die aus den beiden Werten zusammen besteht. Das sind Grundlagen die in jedem Grundlagentutorial vorkommen. Zum Beispiel in dem aus der Python-Dokumentation.
Antworten