シェルブ内のデータを変更するにはどうすればよいですか?
-
26-09-2019 - |
質問
次のコードを使用してシェルフを開きました。
#!/usr/bin/python
import shelve #Module:Shelve is imported to achieve persistence
Accounts = 0
Victor = {'Name':'Victor Hughes','Email':'victor@yahoo.com','Deposit':65000,'Accno':'SA456178','Acctype':'Savings'}
Beverly = {'Name':'Beverly Dsilva','Email':'bevd@hotmail.com','Deposit':23000,'Accno':'CA432178','Acctype':'Current'}
def open_shelf(name='shelfile.shl'):
global Accounts
Accounts = shelve.open(name) #Accounts = {}
Accounts['Beverly']= Beverly
Accounts['Victor']= Victor
def close_shelf():
Accounts.close()
シェルフに値を追加することはできますが、値を変更することはできません。シェルブに存在するデータを変更したい関数 Deposit() を定義しました。しかし、次のエラーが発生します。
Traceback (most recent call last):
File "./functest.py", line 16, in <module>
Deposit()
File "/home/pavitar/Software-Development/Python/Banking/Snippets/Depositfunc.py", line 18, in Deposit
for key in Accounts:
TypeError: 'int' object is not iterable
これが私の関数です:
#!/usr/bin/python
import os #This module is imported so as to use clear function in the while-loop
from DB import * #Imports the data from database DB.py
def Deposit():
while True:
os.system("clear") #Clears the screen once the loop is re-invoked
input = raw_input('\nEnter the A/c type: ')
flag=0
for key in Accounts:
if Accounts[key]['Acctype'].find(input) != -1:
amt = input('\nAmount of Deposit: ')
flag+=1
Accounts[key]['Deposit'] += amt
if flag == 0:
print "NO such Account!"
if __name__ == '__main__':
open_shelf()
Deposit()
close_shelf()
Python は初めてです。助けてください。間違っている場合は修正してください。このコードの機能について誰かに少し説明してもらいたいです。混乱しています。
解決
まず、グローバルを使用しないでください。 Accounts
, 、むしろ前後に渡します。グローバルを使用するとエラーが発生しました。このような:
def open_shelf(name='shelfile.shl'):
Accounts = shelve.open(name) #Accounts = {}
...
return Accounts
def close_shelf(Accounts):
Accounts.close()
def Deposit(Accounts):
...
if __name__ == '__main__':
Accounts = open_shelf()
Deposit(Accounts)
close_shelf(Accounts)
次に、組み込み関数を再定義しないでください。で Deposit()
, の結果を代入します。 raw_input
という名前の変数に input
:
input = raw_input('\nEnter the A/c type: ')
4 行後、組み込みの input
関数:
amt = input('\nAmount of Deposit: ')
しかし、それはうまくいきません。 input
再定義されました!
第三に、棚上げされたアイテムを反復処理するときは、1) 棚上げされたアイテムを取得する、2) アイテムを変更する、3) 変更されたアイテムをシェルフに書き戻すというパターンに従います。そのようです:
for key, acct in Accounts.iteritems(): # grab a shelved item
if val['Acctype'].find(input) != -1:
amt = input('\nAmount of Deposit: ')
flag+=1
acct['Deposit'] += amt # mutate the item
Accounts[key] = acct # write item back to shelf
(この 3 番目のアドバイスは、 ハグブラウンの答えです。)
他のヒント
次のような方が幸運に恵まれると思います。
for key, val in Accounts.iteritems():
if val['Acctype'].find(input) != -1:
amt = input('\nAmount of Deposit: ')
flag+=1
val['Deposit'] += amt
Accounts[key] = val
所属していません StackOverflow