Datei in Liste auslesen, und Liste in 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.
Nobody/Niemand
User
Beiträge: 3
Registriert: Dienstag 29. August 2006, 12:36

Datei in Liste auslesen, und Liste in Datei schreiben

Beitragvon Nobody/Niemand » Dienstag 29. August 2006, 12:44

Eine Frage, die euch vollprofis wahrscheinlich 30s beschäftigen wird, mich jedoch...

Also:
Wie kann ich eine Datei (*.txt) in eine Liste auslesen, und die (evtl. geänderte) Liste nach beenden des Durchlaufs wieder in die Datei zurückschreiben?

Hintergrund:
Es geht um eine, vom Benutzer editierbare (der User kann Worte hinzufügen) Liste, die verschiedene, Wörter beeinhaltet, die alle die gleiche Beduetung haben. Der Grund dafür ist egal, es geht nur um den Befehl. Ich hoffe, ich habe mich verständlich ausgedrückt...

Gruß,
Nobody

P.S.:
hi @ all... :D
Nirven
User
Beiträge: 130
Registriert: Mittwoch 10. Mai 2006, 08:18
Wohnort: Bremerhaven

Beitragvon Nirven » Dienstag 29. August 2006, 12:51

Wie stehen die Wörter denn in der Liste, bzw., wodurch sind sie voneinander getrennt? Bei einer Liste mit einem Zeichen zur Trennung (',' oder ';' als Beispiel) empfiehlt sich das modul csv.

Wenn jedes Wort in einer Zeile steht, eine Datei wird eh Zeilenweise ausgelesen. Dann musst du nur jede Zeile an die Liste anhängen.
Nobody/Niemand
User
Beiträge: 3
Registriert: Dienstag 29. August 2006, 12:36

Beitragvon Nobody/Niemand » Dienstag 29. August 2006, 13:07

Jede Zeile ein Wort.
Und nenne bitte die BEfehle...

/edit
Jaja noob-Frage ;)
pr0stAta
User
Beiträge: 271
Registriert: Freitag 17. September 2004, 11:49
Wohnort: Bremen

Beitragvon pr0stAta » Dienstag 29. August 2006, 13:43

Generell empfiehlt sich folgender Weg:
Datei öffnen
Datei lesen
Datei schließen
Gelesene Daten bearbeiten
Neue Datei erstellen
Daten in die neue Datei schreiben und schließen

ggf alte Datei löschen. So würde ich es jedenfalls machen
Kleines Beispiel(nicht so schön aber funktioniert)

Code: Alles auswählen

'''
bla.txt sieht so aus:
test1
test1
test1
test888888888
test888888888
'''

out = file("bla.txt", "r")
content = out.readlines()
out.close()
clean_content = [item for item in content if item != "test1\n"]
into = file("test_test.txt", "w")
into.write("".join(clean_content))
into.close()

Dieses Beispiel macht genau den oben beschriebenen Teil.
Es überprüft jeden Eintrag in der Liste(oder wie in diesem Fall, also jede Zeile) ob sie den Text "test1\n" enthält, wenn dies der Fall ist, wird dieser
Eintrag übersprungen. In der "test_test.txt" steht also:

test888888888
test888888888
Zuletzt geändert von pr0stAta am Dienstag 29. August 2006, 13:45, insgesamt 1-mal geändert.
Nirven
User
Beiträge: 130
Registriert: Mittwoch 10. Mai 2006, 08:18
Wohnort: Bremerhaven

Beitragvon Nirven » Dienstag 29. August 2006, 13:44

Code: Alles auswählen

f = open('PfadUndDateiname','r')
l = []
for i in f:
    l.append(i)
f.close()


Fertig gelesen, an den Wörtern hängt dann immer noch ein Zeilenumbruch. Musst du eventuell abschneiden, wenn er stört.

Zum schreiben:

Code: Alles auswählen

f = open('PfadUndDateiname','w')
l = ['Wort1\n','Wort2\n','Wort3\n']
for i in l:
    f.write(i)
f.close()


Sollte so gehen. Wenn du die Zeilenumbrüche abgeschnitten hast musst du sie vor dem Schreiben wieder anfügen.[/code]
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Dienstag 29. August 2006, 13:57

...meine Beispiele sind einfach zu lang. :?

Während ich ein Beispiel schreibe, haben schon zwei andere Mitglieder geantwortet. ;-)

Damit ich es nicht umsonst geschrieben habe:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import os.path

FILENAME = "irgendeinname.txt"


def read_wordlist(filename = FILENAME):
    """
    Liest die übergebene Datei aus und gibt eine Liste mit den Wörtern
    zurück. (ohne Zeilenumbrüche am Ende)
   
    :param filename: Dateiname der Datei
    :return: Wortliste oder leere Liste, wenn Datei nicht existiert oder
        kein Wort in der Datei stand.
    """
   
    try:
        f = file(filename, "r")
    except IOError:
        return []
       
    try:
        wordlist = [ word.strip() for word in f if word ]
    finally:
        f.close()
   
    return wordlist


def write_wordlist(wordlist, filename = FILENAME):
    """
    Schreibt die Wörter in die angegebene Datei.
   
    :param wordlist: Wortliste (ohne Zeilenumbruch am Ende)
    :return: True, wenn alles OK.
    """
   
    f = file(filename, "w")
    try:
        f.writelines([ word + "\n" for word in wordlist ])
    finally:
        f.close()
   
    return True


def main():
    """
    Hauptprozedur
    """
   
    # Lesen
    wordlist = read_wordlist()
   
    # Anzeigen und neuen Eintrag hinzufügen
    print wordlist
    wordlist.append("Hallo")
   
    # Schreiben
    write_wordlist(wordlist)


if __name__ == "__main__":
    main()

mfg
Gerold
:-)
Zuletzt geändert von gerold am Dienstag 29. August 2006, 14:21, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Nirven
User
Beiträge: 130
Registriert: Mittwoch 10. Mai 2006, 08:18
Wohnort: Bremerhaven

Beitragvon Nirven » Dienstag 29. August 2006, 14:08

gerold hat geschrieben:Während ich ein Beispiel schreibe, haben schon zwei andere Mitglieder geantwortet. ;-)


Dafür ist es die Luxusvariante :)

Und ich habe gelernt das strip() auch ohne Argument funktioniert (sogar "besser" für meine Wünsche :shock: )
Nobody/Niemand
User
Beiträge: 3
Registriert: Dienstag 29. August 2006, 12:36

Beitragvon Nobody/Niemand » Dienstag 29. August 2006, 14:09

Danke, Leute!
Ich test's mal, und editier dann eventuelle Neu auftauchende Fragen hier rein.

Gruß,
Nobody

/edit
Danke sehr, ihr habt mir sehr geholfen....:D

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]