2012-04-03 9 views
0

私はユーザーにアカウントを提供する簡単なプログラムを書いています。これには、ユーザーが自分のパスワードを何度も変更できることが含まれます。また、電話番号として情報が含まれている場合は、自分のデータを変更できるオプションが必要です。Pythonから.txtを変更する

プログラムは.txtファイルを開いて情報を読み取ります。

例えば、これは.txtが含まれている情報のごく一部です:

 
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 

は今ジョージ(ログイン1)は彼の住所を変更したいとします。私はそれがリストにあると、 "$"で分割された情報を変更するのは簡単だということです。これは、変更リストは次のようになります方法です。

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

しかし、問題はどのように私は内容は次のようになりますように.txtを変更することができますか?

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

どうすればこの問題を解決できますか?

+3

テキストファイルではなく、データベースを使用します。少なくとも、シェルフモジュールを参照してください。 – jordanm

+2

参照:[jordanmが参照していた] [shelveモジュールのドキュメント](http://docs.python.org/library/shelve.html)(http://stackoverflow.com/q/9986340#comment12761978_9986340 ) – icktoofay

+1

さらに、[Pythonにはバインディングがあります](http://docs.python.org/library/sqlite3。html)から小さな組み込み可能なデータベースエンジンである[SQLite3](http://www.sqlite.org/)に変換します。 – icktoofay

答えて

0

フィールドの長さが固定されているテキストファイルを使用しない限り、変更するたびにテキストファイル全体を書き直す必要があります(編集後の各フィールドの開始位置が変更されるため) 。ファイルが小さい限り、特に気付くことはありませんが、ファイルの数が数十行を超えると、これは重要なパフォーマンス上の問題になり始めます。

あなたがデータベースを使用することを提案しているコメント者は、この宿題が生成するように設計されている可能性の高い種類のデータベースなど、使用するデータベースの種類に関する新しい決定を導入しますが後のセクション。 :-)たびは自明であるファイル、しかし無駄な(擬似コードっぽい)を書き換え

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

infoマンに感謝します! – stbamb

0

あなたはタプルのリストに情報を読むことができました。次に、変更したいタプルをあなたが望むものに置き換えます。すべての変更を加えたら、リストをtxtファイルに書き戻します。

2

他の人があなたの質問にコメントの中で示唆しているように、ファイルベースではないソリューションを使用したいと思うかもしれません - 提供された良いリンクを見てください。

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) 

そして、それを実行する:

$ 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

私は、彼らの答えをまっすぐにするのは偉大だとは思わないが、コードブロックを貼り付けるのではなく、少なくともコメントを付けてくれたことをうれしく思います。 – jdi

+0

@ jdiありがとうございます - はい、教育的に役立つように努力しました。うまくいきました:) –

+0

ありがとう@ @ icyrock.com 今、私は新しい情報で私の変更されたファイルを持っています! – stbamb

関連する問題