0

現在、テキスト ファイルの行を読み書きする必要があるゲームをプログラミングしています。テキスト ファイルの特定の行 (つまり、テキスト ファイルの最初の行) を読み取る方法があるかどうか疑問に思っていました。また、特定の場所に行を書き込む方法はありますか (つまり、ファイルの最初の行を変更し、他の行をいくつか書き込んでから、最初の行を再度変更します)。次のように呼び出すことで、行を順番に読み取ることができることを知っています。

f.readline()

編集:応答に基づいて、長さが異なる場合、特定の行を読み取る方法が明らかにありません。私は大規模なグループ プロジェクトのごく一部にしか取り組んでおらず、データの保存方法を変更するには多くの作業が必要です。

しかし、ファイルの最初の行を具体的に変更する方法はありますか? 私は電話を知っています:

f.write('text')

ファイルに何かを書き込みますが、ファイルの先頭ではなく末尾に行を書き込みます。冒頭のテキストを具体的に書き直す方法はありますか?

4

2 に答える 2

1

すべての行が同じ長さであることが保証されている場合はf.seek(N)、ファイルポインタをN番目のバイト(NはLINESIZE * line_number)に配置してから、を使用できますf.read(LINESIZE)。そうでなければ、私は通常のASCIIファイルでそれを行う方法を知りません(これはあなたが求めているものだと思います)。

もちろん、ある種のレコード情報をファイルのヘッダーに保存し、それを最初に読んで、ファイル内のどこを探すべきかを知らせることもできますが、その時点で、すでにある外部ライブラリを使用することをお勧めします。あなたのためにすべての仕事をしました。

テキストファイルが本当に大きくない限り、いつでも各行をリストに保存できます。

with open('textfile','r') as f:
    lines=[L[:-1] for L in f.readlines()]  

(私は改行を取り除いたので、それを維持することを覚えておく必要はありません)

次に、エントリの追加、エントリの削除、エントリの変更などによってリストを操作できます。1日の終わりに、リストをテキストファイルに書き戻すことができます。

with open('textfile','w') as f:
    f.write('\n'.join(lines))

これは、OS-Xで最初の行だけを置き換えるために機能する小さなテストです。

test.dat

this line has n characters
this line also has n characters

test.py

#First, I get the length of the first line -- if you already know it, skip this block
f=open('test.dat','r')
l=f.readline()
linelen=len(l)-1
f.close()

#apparently mode='a+' doesn't work on all systems :( so I use 'r+' instead
f=open('test.dat','r+')
f.seek(0)
f.write('a'*linelen+'\n') #'a'*linelen = 'aaaaaaaaa...' 
f.close()
于 2012-05-25T16:03:26.483 に答える
0

最近では、最適化された方法でファイル内をジャンプすることは、巨大なファイルを管理する高性能アプリケーションのタスクです。

ソフトウェア プロジェクトでは、実行時にファイル内のランダムな場所を読み書きする必要がありますか? アプローチ全体を変更することを検討する必要があると思います。

データが小さい場合は、適切なコンテナー形式 (たとえば、リストまたは dict) 内でメモリ内の実行時にデータを保持 / 変更 / 生成し、一度に (変更時またはプログラムの終了時のみ) 全体を書き込むことができます。単純なデータベースを見ることを検討できます。また、実行時にデータがディクショナリに格納される場合に理想的な形式となる、JSON などの優れたデータ交換形式もあります。

概念をより明確にするための例。既にデータが書き込まれていると考えてくださいgamedata.dat:

[{"playtime": 25, "score": 13, "name": "rudolf"}, {"playtime": 300, "score": 1, "name": "peter"}]

これは utf-8 でエンコードされ、JSON 形式のデータです。Python ゲームの実行中にファイルを読み取ります。

with open("gamedata.dat") as f:
    s = f.read().decode("utf-8")

データを Python 型に変換します。

gamedata = json.loads(s)

データを変更します (新しいユーザーを追加します):

user = {"name": "john", "score": 1337, "playtime": 1}
gamedata.append(user)

ジョンは本当に 1337 ゲーマーです。ただし、この時点で、ユーザーを削除したり、Rudolf のスコアを変更したり、Peter の名前を変更したりすることもできます。いずれにしても、変更後は、新しいデータをディスクに書き戻すことができます。

with open("gamedata.dat", "w") as f:
    f.write(json.dumps(gamedata).encode("utf-8"))

ポイントは、実行時に適切なコンテナ タイプ内でデータを管理 (作成/変更/削除) することです。データをディスクに書き込むときは、ゲームの現在の状態を保存するためにデータ セット全体を書き込みます。

于 2012-05-25T16:11:46.703 に答える