web-dev-qa-db-ja.com

存在しない場合は新しいファイルへの書き込み、存在する場合はファイルへの追加

ユーザーのhighscoreをテキストファイルに書き込むプログラムがあります。ファイルは、ユーザーがplayernameを選択したときに名前が付けられます。

その特定のユーザー名を持つファイルが既に存在する場合、プログラムはファイルに追加する必要があります(複数のhighscoreを見ることができるように)。また、そのユーザー名のファイルが存在しない場合(たとえば、ユーザーが新しい場合)、新しいファイルを作成して書き込む必要があります。

関連する、今のところ機能していないコードは次のとおりです。

try: 
    with open(player): #player is the varible storing the username input
        with open(player, 'a') as highscore:
            highscore.write("Username:", player)

except IOError:
    with open(player + ".txt", 'w') as highscore:
        highscore.write("Username:", player)

上記のコードは、新しいファイルが存在しない場合は作成し、書き込みます。存在する場合、ファイルをチェックしても何も追加されず、エラーは発生しません。

43
Bondenn

興味のある高得点がどこに保存されているかは明確ではありませんが、以下のコードは、ファイルが存在するかどうかを確認し、必要に応じて追加する必要があります。 「try/except」よりもこの方法の方が好きです。

import os
player = 'bob'

filename = player+'.txt'

if os.path.exists(filename):
    append_write = 'a' # append if already exists
else:
    append_write = 'w' # make a new file if not

highscore = open(filename,append_write)
highscore.write("Username: " + player + '\n')
highscore.close()
30
qmorgan

モード「a +」を試しましたか?

_with open(filename, 'a+') as f:
    f.write(...)
_

ただし、f.tell()はPython 2.xで0を返します。詳細については https://bugs.python.org/issue22651 を参照してください。

55

_'a'_ モードで開くだけです:

a書き込み用に開きます。ファイルが存在しない場合は作成されます。ストリームはファイルの末尾に配置されます。

_with open(filename, 'a') as f:
    f.write(...)
_

新しいファイルに書き込んでいるかどうかを確認するには、ストリームの位置を確認します。ゼロの場合、ファイルは空だったか、新しいファイルです。

_with open('somefile.txt', 'a') as f:
    if f.tell() == 0:
        print('a new file or the file was empty')
        f.write('The header\n')
    else:
        print('file existed, appending')
    f.write('Some data\n')
_

まだPython 2)を使用している場合 バグ を回避するには、openの直後にf.seek(0, os.SEEK_END)を追加するか、 _io.open_ 代わりに。

9
user