70

json ファイルにエントリを追加する関数を作成しようとしています。最終的に、次のようなファイルが必要です

[{"name" = "name1", "url" = "url1"}, {"name" = "name2", "url" = "url2"}]

などこれは私が持っているものです:

def add(args):
    with open(DATA_FILENAME, mode='r', encoding='utf-8') as feedsjson:
        feeds = json.load(feedsjson)
    with open(DATA_FILENAME, mode='w', encoding='utf-8') as feedsjson:
        entry = {}
        entry['name'] = args.name
        entry['url'] = args.url
        json.dump(entry, feedsjson)

これにより、次のようなエントリが作成され{"name"="some name", "url"="some url"}ます。しかし、このadd関数を別の名前と URL で再度使用すると、最初のものは上書きされます。最初のエントリに 2 番目 (3 番目...) のエントリを追加するにはどうすればよいですか?

編集feeds:この質問に対する最初の回答とコメントは、書き込みブロックで使用していないという明らかな事実を指摘しています。しかし、それを行う方法がわかりません。たとえば、次のようにするとうまくいきません。

with open(DATA_FILENAME, mode='a+', encoding='utf-8') as feedsjson:
    feeds = json.load(feedsjson)
    entry = {}
    entry['name'] = args.name
    entry['url'] = args.url
    json.dump(entry, feeds)
4

10 に答える 10

45

トップレベルの要素として、辞書の代わりにJSONリストを使用することをお勧めします。

したがって、空のリストでファイルを初期化します。

with open(DATA_FILENAME, mode='w', encoding='utf-8') as f:
    json.dump([], f)

次に、このリストに新しいエントリを追加できます。

with open(DATA_FILENAME, mode='w', encoding='utf-8') as feedsjson:
    entry = {'name': args.name, 'url': args.url}
    feeds.append(entry)
    json.dump(feeds, feedsjson)

を呼び出すたびにファイルの内容全体を書き換えるため、これは実行が遅くなることに注意してくださいadd。ループで呼び出す場合は、事前にすべてのフィードをリストに追加してから、リストを一度に書き出すことを検討してください。

于 2012-10-21T02:54:44.137 に答える
14

aの代わりに使用するとw、新しいファイルを作成したり、既存のファイルのすべてを上書きしたりする代わりに、ファイルを更新できます。

モードの違いについては、この回答を参照してください。

于 2012-10-21T02:42:28.303 に答える
3

読み込んだデータに関係することは何も書いていません。作成している新しいものにフィードのデータ構造を追加しますか?

または、ファイルを追加モードで開き、open(filename, 'a')文字列を追加する必要があるかもjson.dumpsしれませんjson.dump

于 2012-10-21T02:38:23.853 に答える