2

次の構造の「users.txt」というタイトルのファイルがあります。username:info_about_the_user.

このようなもの:

users.txt:

マーク:stuffabouthim
アンソニー:stuffabouthimpeter
:stuffabouthim
peterpeter:stuffabouthim
peterpeterpeter:stuffabouthim
peterpeterpeterpeter:stuffabouthim

スクリプトの次の部分では行を変更する必要があります(ユーザーに関する情報を変更します)が、文字列が複製されると問題が発生し(peter-peterpeter)、修正方法がわかりません。

def test():
    fn = 'users.txt'
    f = open(fn)
    output = []
    changeuser = 'peterpeter'
    userinfo = 'HeIsTall'
    for line in f:
        if not changeuser+":" in line:
            output.append(line)
    f.close()
    f = open(fn, 'w')
    f.writelines(output)
    f.close()
    f = open("users.txt", "a")
    f.write(changeuser + ":" + userinfo+"\n")
    f = open("users.txt", "a")

test()

これは私が持っている入力です:

入力:users.txt:

マーク:stuffabouthim
アンソニー:stuffabouthimpeter
:stuffabouthim
peterpeter:HesAwesome
peterpeterpeter:stuffabouthim
peterpeterpeterpeter:stuffabouthim

peterpeterに関する情報を変更し、次の出力を取得したい:

欲しい出力:users.txt:

マーク:stuffabouthim
アンソニー:彼についてのもの
peter:stuffabouthim
peterpeter:HeIsTall
peterpeterpeter:stuffabouthim
peterpeterpeterpeter:stuffabouthim

しかし、これは私が持っている入力です。とりわけ、peterpeterの背後にあるすべての行が削除されています。

マーク:stuffabouthim
アンソニー:stuffabouthim
ピーター: stuffabouthimピーターピーター:
HeIsTall

誰かが私に以下のコードで希望の出力を得るための助けを与えることができますか?ありがとう。

4

3 に答える 3

3

fileinputモジュールを使用すると、簡単に実行できます。

import fileinput

def test():
    fn = 'users.txt'

    changeuser = 'peterpeter'
    newinfo = 'HeIsTall'

    for line in fileinput.input(fn, inplace=1):
        user, oldinfo = line.split(':')
        print '%s:%s' % (user, newinfo if user == changeuser else oldinfo.replace('\n', ''))

if __name__ == "__main__":
    test()
于 2012-07-06T09:55:42.017 に答える
2

これを試して:

def test():
    fn = 'users.txt.txt'
    f = open(fn)
    output = []
    changeuser = 'peterpeter'
    userinfo = 'HeIsTall'
    for line in f:
        if line.strip().split(':')[0]!=changeuser:
            output.append(line)
        else:
            output.append(changeuser + ":" + userinfo+"\n")

    f.close()
    f = open(fn, 'w')
    f.writelines(output)
    f.close()

test()

出力:

mark:stuffabouthim
anthony:stuffabouthim
peter:stuffabouthim
peterpeter:HeIsTall
peterpeterpeter:stuffabouthim
peterpeterpeterpeter:stuffabouthim
于 2012-07-06T09:36:55.377 に答える
2

if-clause で論理エラーが発生しました。これはすべてのピーターを削除します*。残っているピーターは、ファイルに追加したピーターだけです。

for line in f:
        if not changeuser+":" in line:  #THAT MEANS ALL PETERS ARE IGNORED!
            output.append(line)

一般に、否定節よりも肯定節を理解する方が簡単です。

for line in f:
   if changeuser+":" in line:
      output.append('%s:%s\n' %(changeuser,userinfo))
   else:
      output.append(line)

良いコードは読みやすいです。レポートを書くようにコーディングしてみてください。これにより、コードが関数などの小さな断片に自動的に分割されます。例えば:

lines = read_all_lines_from_file(filename)
change_user_info(lines, user, userinfo)
save_lines_to_file(lines, filename)

コードは小さな断片に分割され、エラーが発生した場合、数ページにわたって作業するのではなく、数行のコードに固定できます。;-)

于 2012-07-06T09:56:25.120 に答える