使用 pickle 时无法重载 python 对象
Can't overload python object while using pickle
通过输入命令获取输入并从主文件调用对象。
rafTur = input(' : ')
rafKat = input(' : ')
rafNo = input( : ')
rafIndex = input(' : ')
req.search_record(' : ')
req.search_record(rafTur, rafKat, rafNo, rafIndex)
req.py :
def search_record( rafTur, rafKat, rafNo, rafIndex= None):
infile = open('noSqlDB', 'rb')
flag = False
while True:
try:
reading the oject from file
sistem = pickle.load(infile)
if sistem['rafTur'] == rafTur and sistem['rafKat'] == rafKat and sistem['rafNo'] == rafNo and rafIndex==None: # This is where the error happens
print("Raf No : ",sistem['rafIndex'],"Raf data : ",sistem['rafIndexData'])
print(":", rafIndex)
flag = True
break
# display record if found and set flag
if (sistem['rafTur'] == rafTur and sistem['rafKat'] == rafKat and sistem['rafNo'] == rafNo and sistem['rafIndex'] == rafIndex):
print(sistem['rafIndexData'],"\n")
flag = True
break
except EOFError:
print("deb")
break
if flag == False:
print('Record not Found')
print()
infile.close()
我正在尝试重载 search_record()
函数。当我将 = None
放入 rafIndex
变量时,程序以 OFError
退出并打印 deb
(仅用于调试)。如果没有 = None
命令,代码在没有 = None
命令的情况下也能正常工作。
我尝试将带有 == None
的 if 语句更改为 == ''
它也不起作用。我还尝试通过 rafIndex = None
手动将 rafIndex 分配给 None
但它也不起作用。
在 Clion 中使用 python 3.9 virtualenv
我认为您的问题出在您尝试加载已腌制对象的前一行。
如果您可以在此处粘贴堆栈跟踪而不是捕获异常,那将非常有帮助。如果在执行 pickle.load
之后打印 'sistem' 对象,对于调试也会有帮助
所以主要问题是变量和输入的类型不同。所以将它们转换为 int 和 string 将解决问题。
创建了一个转换函数:
def toCast(rafTur, rafKat, rafNo, rafIndex):
if rafTur != "":
rafTur = str(rafTur) #Change this
if rafKat != "":
rafKat = int(rafKat)
if rafNo != "":
rafNo = int(rafNo)
if rafIndex != "":
rafIndex = int(rafIndex)
return rafTur,rafKat,rafNo,rafIndex
如果函数不为空,则该函数进行转换,之后我在 main 中使用了这个函数,如下所示:
elif choice == '3':
rafTur = input('Rafın türünü giriniz : ')
rafKat = input('Rafın katını giriniz : ')
rafNo = input('Rafın Nosunu giriniz : ')
rafIndex = input('Rafın indexini giriniz : ')
rafTur,rafKat,rafNo,rafIndex = req.toCast(rafTur, rafKat, rafNo, rafIndex)
req.search_record(rafTur, rafKat, rafNo, rafIndex)
之后,我将 search_record(rafTur, rafKat, rafNo, rafIndex)
中的 if else 更改为:
def search_record(rafTur, rafKat, rafNo, rafIndex):
infile = open('noSqlDB', 'rb')
sistem = pickle.load(infile)
flag = False
# read to the end of file.
for x in range((len(sistem)+1)):
try:
if (sistem['rafTur'].upper() == rafTur.upper() and rafKat == "" and rafNo == ""
and rafIndex == ""):
print(sistem['rafTur'],sistem['rafNo'], sistem['rafIndex'], sistem['rafIndexData'])
flag = True
elif (sistem['rafTur'].upper() == rafTur.upper() and sistem['rafKat'] == rafKat and
rafNo == "" and rafIndex == ""):
print(sistem['rafNo'], sistem['rafIndex'], sistem['rafIndexData'])
flag = True
elif (sistem['rafTur'].upper() == rafTur.upper() and sistem['rafKat'] == rafKat and sistem[
'rafNo'] == rafNo and rafIndex == ""):
print(sistem['rafIndex'], sistem['rafIndexData'])
flag = True
elif (sistem['rafTur'].upper() == rafTur.upper() and sistem['rafKat'] == rafKat and sistem[
'rafNo'] == rafNo and sistem['rafIndex'] == rafIndex):
print(sistem['rafIndexData'])
flag = True
sistem = pickle.load(infile)
except EOFError:
break
if flag == False:
print('Record not Found')
print()
# close the file
infile.close()
通过输入命令获取输入并从主文件调用对象。
rafTur = input(' : ')
rafKat = input(' : ')
rafNo = input( : ')
rafIndex = input(' : ')
req.search_record(' : ')
req.search_record(rafTur, rafKat, rafNo, rafIndex)
req.py :
def search_record( rafTur, rafKat, rafNo, rafIndex= None):
infile = open('noSqlDB', 'rb')
flag = False
while True:
try:
reading the oject from file
sistem = pickle.load(infile)
if sistem['rafTur'] == rafTur and sistem['rafKat'] == rafKat and sistem['rafNo'] == rafNo and rafIndex==None: # This is where the error happens
print("Raf No : ",sistem['rafIndex'],"Raf data : ",sistem['rafIndexData'])
print(":", rafIndex)
flag = True
break
# display record if found and set flag
if (sistem['rafTur'] == rafTur and sistem['rafKat'] == rafKat and sistem['rafNo'] == rafNo and sistem['rafIndex'] == rafIndex):
print(sistem['rafIndexData'],"\n")
flag = True
break
except EOFError:
print("deb")
break
if flag == False:
print('Record not Found')
print()
infile.close()
我正在尝试重载 search_record()
函数。当我将 = None
放入 rafIndex
变量时,程序以 OFError
退出并打印 deb
(仅用于调试)。如果没有 = None
命令,代码在没有 = None
命令的情况下也能正常工作。
我尝试将带有 == None
的 if 语句更改为 == ''
它也不起作用。我还尝试通过 rafIndex = None
手动将 rafIndex 分配给 None
但它也不起作用。
在 Clion 中使用 python 3.9 virtualenv
我认为您的问题出在您尝试加载已腌制对象的前一行。 如果您可以在此处粘贴堆栈跟踪而不是捕获异常,那将非常有帮助。如果在执行 pickle.load
之后打印 'sistem' 对象,对于调试也会有帮助所以主要问题是变量和输入的类型不同。所以将它们转换为 int 和 string 将解决问题。
创建了一个转换函数:
def toCast(rafTur, rafKat, rafNo, rafIndex):
if rafTur != "":
rafTur = str(rafTur) #Change this
if rafKat != "":
rafKat = int(rafKat)
if rafNo != "":
rafNo = int(rafNo)
if rafIndex != "":
rafIndex = int(rafIndex)
return rafTur,rafKat,rafNo,rafIndex
如果函数不为空,则该函数进行转换,之后我在 main 中使用了这个函数,如下所示:
elif choice == '3':
rafTur = input('Rafın türünü giriniz : ')
rafKat = input('Rafın katını giriniz : ')
rafNo = input('Rafın Nosunu giriniz : ')
rafIndex = input('Rafın indexini giriniz : ')
rafTur,rafKat,rafNo,rafIndex = req.toCast(rafTur, rafKat, rafNo, rafIndex)
req.search_record(rafTur, rafKat, rafNo, rafIndex)
之后,我将 search_record(rafTur, rafKat, rafNo, rafIndex)
中的 if else 更改为:
def search_record(rafTur, rafKat, rafNo, rafIndex):
infile = open('noSqlDB', 'rb')
sistem = pickle.load(infile)
flag = False
# read to the end of file.
for x in range((len(sistem)+1)):
try:
if (sistem['rafTur'].upper() == rafTur.upper() and rafKat == "" and rafNo == ""
and rafIndex == ""):
print(sistem['rafTur'],sistem['rafNo'], sistem['rafIndex'], sistem['rafIndexData'])
flag = True
elif (sistem['rafTur'].upper() == rafTur.upper() and sistem['rafKat'] == rafKat and
rafNo == "" and rafIndex == ""):
print(sistem['rafNo'], sistem['rafIndex'], sistem['rafIndexData'])
flag = True
elif (sistem['rafTur'].upper() == rafTur.upper() and sistem['rafKat'] == rafKat and sistem[
'rafNo'] == rafNo and rafIndex == ""):
print(sistem['rafIndex'], sistem['rafIndexData'])
flag = True
elif (sistem['rafTur'].upper() == rafTur.upper() and sistem['rafKat'] == rafKat and sistem[
'rafNo'] == rafNo and sistem['rafIndex'] == rafIndex):
print(sistem['rafIndexData'])
flag = True
sistem = pickle.load(infile)
except EOFError:
break
if flag == False:
print('Record not Found')
print()
# close the file
infile.close()