4

さまざまなオブジェクトを(クラスとオブジェクトを使用して)作成し、それらをファイルに保存して後で編集または取得しようとしています。しかし、このように見えます。

GlobalCategories=[]
GlobalContent=[]
def LoadData(x,y):
   import pickle
   with open('bin.dat') as f:
       x,y = pickle.load(f)


def SaveData(x,y):
   import pickle
   with open('bin.dat', 'wb') as f:
      pickle.dump([x,y], f)

def Loader(x,y):
     try:
          LoadData(x,y)
     except:
          SaveData(x,y)

これは、情報をリストに保存する方法を示す保存のスニペットです (テーマはクラスで、他のものはそのクラスのメソッドです):

newtheme=Tema()
newtheme.setInfo_name(newstr)
newtheme.setInfo_code(newcode)
GlobalCategories.append(newtheme)
SaveData(GlobalContent,GlobalCategories)

XとYは、オブジェクトを保存するグローバルリストです(各オブジェクトのメモリに方向を保存することに気付きました)。最初に実行すると、ファイルが作成され、ファイルに情報が保存されますが、閉じるともう一度実行して情報を読み込もうとすると、プログラムは情報を消去し、ファイルを再度作成するため、保存されていたものはすべて失われます。

これがオブジェクトを格納するための適切な方法なのか、それともより良い方法があるのか​​ どうかはわかりません。アドバイスをいただければ幸いです。

@abernert: ありがとう abarnert! 私がやりたいことは、2 つのリストを含むリストを保存することです。たとえば、1 つのリストはメーカー (トヨタ、ニッサンなど) を保存し、もう 1 つのリストは車のモデル (ツンドラ、ムラーノ) を保存します。各要素は、作成時にリストに追加するオブジェクトです。 newtheme=Theme() newtheme.setInfo_name(newstr) GlobalCategories.append(newtheme) これは、オブジェクトをグローバル リストに保存する方法です。GlobalCategories は、プログラムを終了した後でロードしたい 2 つのリストの 1 つです (例の自動車会社のリストのようになります)。ここで、シェルを閉じていないときにリストからオブジェクトを取得して編集できるため、プログラムを閉じて再起動した後にリストからオブジェクトをロードすることに問題があります。プログラムを起動したら、後で操作できるように、メーカーと車のオブジェクトをそれぞれのリストにロードして保存する必要があります。abernert もう一度ありがとう!

4

2 に答える 2

7

LoadData関数と関数をどのように使用しようとしているのかという文脈がなければ、問題が何であるかを知ることは困難ですSaveData。ただし、ここにあなたが望むと思うことを行う小さなデモがあります。

import pickle
import random

def load_data():
    try:
        with open("bin.dat") as f:
            x, y = pickle.load(f)
    except:
        x, y = [], []
    return x, y

def save_data(data):
    with open("bin.dat", "wb") as f:
        pickle.dump(data, f)

if __name__ == "__main__":
    x, y = load_data()
    print x, y
    x.append(random.randint(1, 10))
    y.append(random.randint(1, 10))
    save_data([x, y])

連続実行からの出力

[] []
[9] [9]
[9, 10] [9, 9]
[9, 10, 2] [9, 9, 4]
[9, 10, 2, 5] [9, 9, 4, 1]
[9, 10, 2, 5, 6] [9, 9, 4, 1, 9]
[9, 10, 2, 5, 6, 10] [9, 9, 4, 1, 9, 1]
于 2013-06-12T23:17:28.993 に答える
0

確かなことはわかりませんが、あなたの問題は、バイナリ ファイルを作成し、それをテキストとして読み戻そうとしていて、Windows で Python 2.x を使用していることだと思います。

このコードでは:

def LoadData(x,y):
    import pickle
    with open('bin.dat') as f:
        x,y = pickle.load(f)

たまたまバイナリ pickle ストリームに LF 改行文字が含まれていた場合、ファイルをテキストとして開くと、CR/LF ペアに変換されます。これにより、ピクルが無効になるため、例外が発生します。

このコードでは:

def Loader(x,y):
     try:
          LoadData(x,y)
     except:
          SaveData(x,y)

…例外を飲み込み、いくつかの空の値を保存するだけです。

おそらく、ここでは file-not-found エラーのみを処理する必要があります ( Python のバージョンに応じてIOErrorOSError、または)。FileNotFoundError

ただし、次のように、問題のデバッグに役立つように例外を変数に入れたいと思うことは間違いありません。

def Loader(x,y):
     try:
          LoadData(x,y)
     except Exception as e:
          SaveData(x,y)

SaveDataデバッガーの行にブレークポイントを配置するか、print(e)行を追加して出力を監視し、そこに到達する理由を確認できます。


その間、それを修正した後でも、LoadData何も役に立ちません。x,y = pickle.load(f)割り当ては、ローカル変数xy. それらが のローカル変数と同じ名前を持っているという事実は、の変数が変更さLoaderれるという意味ではありません。Loader同じ値を参照していたという事実もありません。

Python には「参照変数」や「出力パラメーター」がありません。これを行う通常の方法は、呼び出し元に返したい値を返すだけです。

def LoadData():
    import pickle
    with open('bin.dat') as f:
        x,y = pickle.load(f)
    return x,y

もちろんLoader、それを適切に呼び出す必要があります。

def Loader(x,y):
     try:
          x,y = LoadData()
     except:
          SaveData(x,y)

でまったく同じ問題が再び発生するLoaderため、そこで再度修正する必要があります。

于 2013-06-12T23:45:56.047 に答える