0

私が持っているのは、pickle を使用して 3 つの異なるファイルにダンプする 3 つの辞書です。私は元々、ファイルごとに読み取りおよび書き込み関数を作成したばかりなので、合計 6 つの関数です。それで昨夜、私はそれを作ろうとしたので、1つの読み取り関数と1つの書き込み関数を使用するだけで済みます。書き込み機能は動作するようになりましたが、読み取り機能は動作しません。私は昨夜からこの問題の解決策を探していましたが、うんざりしているので、あなたができる助けをいただければ幸いです. あなたが言うことができなかった場合、私はプログラミング/ Pythonが初めてです。私が使用しているコードは次のとおりです。

w = {} # would be past in as source

def writing(filename, source): 
    with open(filename, 'wb') as st:
        pickle.dump(source, st)

def reading(filename, source):
    with open(filename, 'rb') as st:
        source = pickle.loads(st.read())

reading('test.txt', w)

私が得たエラーは次のとおりです。

Traceback (most recent call last):
  File "./database.py", line 303, in <module>
   pw.check_pwd(p)
  File "./database.py", line 47, in check_pwd
    if self.pwds[self.user] == hashlib.sha512(self.pwd + self.salt).hexdigest():
KeyError: 'Codex' this was the error I was getting sorry for the bad post
4

4 に答える 4

1

あなたが口述を取り戻すと確信しているなら、あなたは次のようにreading()なることもできます

def reading(filename, source):
    with open(filename, 'rb') as st:
        tmp = pickle.loads(st.read())
    source.update(tmp)

しかし、正直なところ、returnkatrielalexによる解決策の方が優れています。

于 2012-06-26T17:15:08.693 に答える
1

あなたがどのような問題を試みているのかはわかりませんが、グローバルw変数で unpickle した結果が欲しいと確信していますよね? このようにすることはできません。変数に値をsource割り当てると、ローカル変数のみが更新されますsourceが、変数wは依然として同じ値を指しています。おそらく、この答えは何が起こっているのかを理解するのに役立つかもしれません.

それにはさまざまな解決策があります。私のお気に入りの 1 つは @katrielatex のものです: 値を返します:

def reading(filename, source):
    with open(filename, 'rb') as st:
        source = pickle.loads(st.read())
    return source
w = reading(filename, w)

source実際には、パラメータさえ必要ありません:

def reading(filename):
    with open(filename, 'rb') as st:
        source = pickle.loads(st.read())
        return source

w = reading(filename)

別の解決策は、 が指す辞書を更新するsourceことです。この場合、返品は必要ありません。

def reading(filename, source):
    with open(filename, 'rb') as st:
        source.update(pickle.loads(st.read()))

reading(filename, w)

また、関数内でグローバル変数を作成することもできwます (ただし、これは最悪の解決策です)。

def reading(filename):
    global w
    with open(filename, 'rb') as st:
        w = pickle.loads(st.read())

reading(filename)
于 2012-06-26T17:14:14.377 に答える
1

return source2番目の関数で必要です:

def reading(filename, source):
    with open(filename, 'rb') as st:
        source = pickle.loads(st.read())
    return source

それ以外の場合、Python はデフォルトで何も返しません ( None)。

于 2012-06-26T17:04:26.910 に答える
0

読み取り関数はファイル名のみを必要とし、何かを返す必要があります。

def save(filename, data): 
    with open(filename, 'wb') as f:
        pickle.dump(data, f)

def load(filename):
    with open(filename, 'rb') as f:
        return pickle.load(f)

例:

save('data.pickle', [a, b, c])
a, b, c = load('data.pickle')
于 2012-06-26T17:20:09.337 に答える