我有以下课程:
class Document:
_queryID = ""
_name = []
_docId = ""
在代码中,我创建了一个名为listDocuments的列表。我用文档类型的对象填充列表。
import pickle
if __name__ == "__main__":
listDocuments = []
for i in range(0,10):
e = Document()
e._queryID = str(i)
e._docId = str(i+1)
e._name.append("h"+str(i))
listDocuments.append(e)
save_data(listDocuments, "Variations.dat")
list = load_data("Variations.dat")
for obj in listEntities:
print obj._queryID + "==>"+ obj._docId
for var in obj._name:
print var +" "
print "----\n"
我使用了以下来自Python的函数:如何在文件中保存带有对象的列表:
#save list of variations
def save_data(data, path):
with open(path, "wb") as f:
pickle.dump(data, f)
#load list of variations (Correctd after comments thank you)
def load_data(var_file):
try:
with open(var_file) as f:
listDocument = pickle.load(f)
except:
listDocument = []
return listDocument
好的,有几个问题。
第一的:
def load_data(var_file):
try:
with open(var_file) as f:
listDocument = pickle.load(f)
except:
listDocuments = []
return listDocuments
您同时使用listDocument
和listDocuments
。(注意一个在结尾s
)。同样,您listDocuments
在外部程序中使用这些变量来隐藏错误。让我们将函数内部的变量重命名data
为save_data
函数一样。我们也将重新命名var_file
,以path
对同一一致性的原因。
考虑:
def load_data(path):
data = []
try:
with open(path) as f:
data = pickle.load(f)
except: pass
return data
接下来,您要使用的list
是保留的内置-将其更改为lst
。现在,您有了:
class Document:
_queryID = ""
_name = []
_docId = ""
def save_data(data, path):
with open(path, "wb") as f:
pickle.dump(data, f)
#load list of variations
def load_data(path):
data = []
try:
with open(path) as f:
data = pickle.load(f)
except: pass
return data
import pickle
if __name__ == "__main__":
listDocuments = []
for i in range(0,10):
e = Document()
e._queryID = str(i)
e._docId = str(i+1)
e._name.append("h"+str(i))
listDocuments.append(e)
save_data(listDocuments, "Variations.dat")
lst = load_data("Variations.dat")
for elem in lst:
print elem._queryID
print elem._docId
print elem._name
print "---"
哪个可行,并打印:
0
1
['h0', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'h7', 'h8', 'h9']
---
1
2
['h0', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'h7', 'h8', 'h9']
---
2
3
['h0', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'h7', 'h8', 'h9']
---
3
4
['h0', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'h7', 'h8', 'h9']
---
4
5
['h0', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'h7', 'h8', 'h9']
---
5
6
['h0', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'h7', 'h8', 'h9']
---
6
7
['h0', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'h7', 'h8', 'h9']
---
7
8
['h0', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'h7', 'h8', 'h9']
---
8
9
['h0', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'h7', 'h8', 'h9']
---
9
10
['h0', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'h7', 'h8', 'h9']
---
编辑
根据您的编辑,您没有任何listEntities
变量-我认为您的意思是(最近重命名的)lst
:
for obj in lst:
print obj._queryID + "==>"+ obj._docId
for var in obj._name:
print var +" "
print "----\n"
最后,如果您想知道为什么_name
变量对于Document
该类的所有实例都是相同的,那是因为您是在声明_name
为类属性(因此对于所有实例都相同),而不是实例属性。
您可以将Document
类定义替换为:
class Document:
def __init__(self):
self._name = []
而且您可能会更满意以下结果:
0==>1
h0
----
1==>2
h1
----
2==>3
h2
----
3==>4
h3
----
4==>5
h4
----
5==>6
h5
----
6==>7
h6
----
7==>8
h7
----
8==>9
h8
----
9==>10
h9
----
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句