2012-04-03 13 views
0

Ich schreibe ein einfaches Programm, das dem Benutzer einen Account anbietet. Dies beinhaltet, dass der Benutzer sein Passwort immer wieder ändern kann. Und wenn er oder sie Informationen als ihre Telefonnummer enthält, muss es Optionen geben, die es ihnen ermöglichen, ihre eigenen Daten zu ändern.Ändern von .txt aus Python

Das Programm wird .txt Dateien öffnen und lesen Sie die Informationen.

Zum Beispiel ist dies ein kleiner Teil der Info, dass die .txt beinhaltet:

 
123$333$Harold$321$Far far away3 
124$444$George$654$Far far away4 #I logged in with this account 
125$555$Louis$987$Far far away5 

Nehmen wir nun an, dass George (derjenige, der angemeldet) will seine Adresse ändern. Ich meine, es ist einfach, die Information zu ändern, sobald sie auf der Liste ist, geteilt durch das "$". Dies ist, wie die modifizierte Liste aussehen wird:

[124, 444, 'George', 654, '22 Acacia Avenue'] 

Aber die Frage ist, wie kann ich die .txt so ändern, dass der Inhalt wie folgt aussehen?

 
123$333$Harold$321$Far far away3 
124$444$George$654$22 Acacia Avenue 
125$555$Louis$987$Far far away5 

Wie kann ich das erreichen?

+3

Verwenden Sie eine Datenbank, keine Textdatei. Zumindest, siehe das Regalmodul. – jordanm

+2

Siehe auch: [Dokumentation für 'shelve' Modul] (http://docs.python.org/library/shelve.html), auf die sich [jordanm] bezieht (http://stackoverflow.com/q/9986340#comment12761978_9986340) – icktoofay

+1

Zusätzlich hat [Python eine Bindung] (http://docs.python.org/library/sqlite3.html) zu [SQLite3] (http://www.sqlite.org/), das eine kleine einbettbare Datenbank-Engine ist. – icktoofay

Antwort

0

Wenn Sie keine Textdatei verwenden, deren Felder eine feste Länge haben, müssen Sie die gesamte Textdatei jedes Mal neu schreiben, wenn Sie eine Änderung vornehmen (weil Sie die Startposition jedes Felds nach dem ändern ändern) . Solange die Datei klein ist, werden Sie dies nicht besonders bemerken, aber wenn die Datei mehr als ein paar Dutzend Zeilen enthält, wird dies zu einem erheblichen Leistungsproblem.

Die Kommentatoren, die vorschlagen, dass Sie eine Datenbank verwenden, haben weitgehend recht, obwohl dies eine neue Reihe von Entscheidungen darüber enthält, welche Art von Datenbank zu verwenden ist, die wahrscheinlich die Art von Fragen sind, die diese Hausaufgaben erzeugen sollen ein späterer Abschnitt. :-)

die Datei Umschreiben jedes Mal trivial ist jedoch verschwenderisch (Pseudo-Code-ish):

new_data = [124, 444, 'George', 654, '22 Acacia Avenue'] 

f = open(path, mode) # Open with some mode that makes sense for how you write it 
        # or clear the file before you write your new list 
lines = [] 

# Now we can iterate over every line in the file 
for line in f: 
    # Check to see if this line starts with the same data before the '$' as the 
    # first field of the new_data list 
    if line.split("$")[0] == new_data[0]: 
    # if it does, put in new_data instead of the line we just read 
    lines.append("$".join(new_data)) 
    else: 
    # Not the line we're looking for, write it back into the file so it stays the same 
    lines.append(line) 
f.writelines(lines) 
+0

Danke für den Info-Mann! – stbamb

0

Sie könnten die Informationen in eine Liste von Tupeln lesen. Ersetzen Sie dann das Tupel, das Sie ändern möchten, mit dem, was Sie möchten. Wenn Sie alle gewünschten Änderungen vorgenommen haben, schreiben Sie die Liste wieder in die TXT-Datei.

2

Wie andere in den Kommentaren zu Ihrer Frage vorgeschlagen haben, möchten Sie möglicherweise Lösungen verwenden, die nicht dateibasiert sind - werfen Sie einen Blick auf die bereitgestellten guten Links.

Wenn Sie Ihre Hausaufgaben Sie erfordert eine Textdatei (oder möchten Sie mit Dateien aus Gründen des Lernens, die arbeiten), können Sie etwas tun:

inf.txt:

123$333$Harold$321$Far far away3 
124$444$George$654$Far far away4 
125$555$Louis$987$Far far away5 

mkt.py:

# Read the file 
with open('inf.txt', 'r') as f: 
    lines = f.readlines() 

# Split the lines by '$' 
lines_split = [line.split('$') for line in lines] 

# Change address of the second login 
line_to_change = lines_split[1] 
# Change just last column 
line_to_change[-1] = '22 Acacia Avenue\n' 

# Combine back 
lines_out = ['$'.join(line) for line in lines_split] 

# Write the file 
with open('outf.txt', 'w') as f: 
    f.writelines(lines_out) 

und Ausführen von ihm:

$ python mkt.py 
$ cat outf.txt 
123$333$Harold$321$Far far away3 
124$444$George$654$22 Acacia Avenue 
125$555$Louis$987$Far far away5 
$ 
+0

Ich denke nicht, dass es großartig ist, ihnen die Antwort direkt zu geben, aber ich bin froh, dass du das zumindest mit Kommentaren durchbrochen hast, anstatt einen Block Code einzufügen. – jdi

+0

@jdi Danke - ja, versucht, in pädagogischem Sinne hilfreich zu sein, hoffe, es hat funktioniert :) –

+0

Vielen Dank @ icyrock.com Jetzt habe ich meine modifizierte Datei, mit der neuen Info! – stbamb