5

さて、私の質問はかなり具体的であり、前もってお詫び申し上げます。私は新しいプログラマーで、自分でゼロから開発しようとしました。それは比較的うまくいきましたが、私が見ることができる最後の問題が 1 つあります。ここで私のコード全体を表示できます。

計画

したがって、私が抱えている問題は、ファイルの保存方法に関連しています。辞書なので最初にピクルしようとしましたが、辞書が
(名前、クラス)のペアであるため、エラーが発生し続けました。

ここを検索したところ、JSON を試して同じことができることがわかりました。同じ種類のエラーで終わりました。最終的に、動作する klepto モジュールを見つけました。辞書を正常に保存し、正常にロードしました。ファイルに新しいアイテムを追加できることがわかったのは後になってからでしたが、辞書から何かを削除して保存するたびに。次回はロードします。外した鍵はそのままです。

TLDR: dict に問題なく追加して txt ファイルに保存できますが、dict から削除して保存すると、削除されたキーは保存されません。

とにかく、ファイルを保存する方法、またはファイルをロードする方法、またはその両方に問題がある場所に困惑していますか? どんな助けでも大歓迎です。

編集:わかりました、それが現在保存およびロードするように設定されている方法だと思います。

try:
    alcohols = file_archive('Alcohols.txt')
    alcohols.load()
except IOError:
    alcohols = {}
    print('alcohols doesn\'t exist.')

print('Exiting and saving the data.')
        alcohols.dump('Alcohols.txt') #saves the dictionary data as is

新しいアイテムを追加している間、辞書はうまく保存されますが、編集して何かを削除してから保存して終了する必要があると言います。次回ロードすると、新しいアイテムだけでなく古いアイテムも含まれます。奇妙なことに、すべての編集で何かが壊れているようです。新しいエントリを保存しません。

編集2:

                del alcohols[name] #deletes the key out of the dict

こんな感じで鍵を外します。もともと pop メソッドを使用していましたが、変更が保存されないときにこれを試しました。注意として、ディクショナリからキー、値を削除しましたが、保存とリロードはその変更を反映しません。

                alcohols[name] = Alcohol() #instantiates the new class

これが、新しいキーと値のペアを作成する方法です。

解決済み編集:

私の問題は、それらを辞書から削除する方法にありました。後で誰かがここに出くわした場合に備えて。@Mike Mckernsの回答を見てください。アーカイブされた辞書から削除する必要がありました。

4

1 に答える 1

8

基本的に、「ファイル」キャッシュからではなく、「メモリ内」キャッシュから削除しています。デフォルトでは、kleptoアーカイブは「メモリ内」キャッシュを提供します。これは、dict インターフェイスを介して直接使用できarchive、バックエンドである も提供します。

したがって、 を実行するとdump、メモリ内のアイテムがバックエンドに転送されます。キャッシュとアーカイブから削除するには、両方から削除する必要があります。

>>> from klepto.archives import *
>>> arch = file_archive('foo.txt')
>>> arch['a'] = 1
>>> arch['b'] = 2
>>> # look at the "in-memory" copy
>>> arch
file_archive('foo.txt', {'a': 1, 'b': 2}, cached=True)
>>> # look at the "on-disk" copy
>>> arch.archive
file_archive('foo.txt', {}, cached=False)
>>> # dump from memory to the file
>>> arch.dump()
>>> arch.archive
file_archive('foo.txt', {'a': 1, 'b': 2}, cached=False)
>>> arch 
file_archive('foo.txt', {'a': 1, 'b': 2}, cached=True)
>>> # delete from the in-memory cache
>>> arch.pop('a')
1
>>> # delete from the on-disk cache
>>> arch.archive.pop('a')
1
>>> arch
file_archive('foo.txt', {'b': 2}, cached=True)
>>> arch.archive
file_archive('foo.txt', {'b': 2}, cached=False)

1回の関数呼び出しで両方から簡単に削除できると思います...

于 2015-03-27T00:09:42.487 に答える