Seite 1 von 1

Datei in Liste auslesen, und Liste in Datei schreiben

Verfasst: Dienstag 29. August 2006, 12:44
von Nobody/Niemand
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

Verfasst: Dienstag 29. August 2006, 12:51
von Nirven
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.

Verfasst: Dienstag 29. August 2006, 13:07
von Nobody/Niemand
Jede Zeile ein Wort.
Und nenne bitte die BEfehle...

/edit
Jaja noob-Frage ;)

Verfasst: Dienstag 29. August 2006, 13:43
von pr0stAta
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

Verfasst: Dienstag 29. August 2006, 13:44
von Nirven

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]

Verfasst: Dienstag 29. August 2006, 13:57
von gerold
...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
:-)

Verfasst: Dienstag 29. August 2006, 14:08
von Nirven
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: )

Verfasst: Dienstag 29. August 2006, 14:09
von Nobody/Niemand
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