我已经创建了一个将对象写入文件的函数:
def StoreToFile(Thefile,objekt):
utfil=None
utfil=open(Thefile,'wb')
pickle.dump(objekt,utfil)
return True
if utfil is not None:
utfil.close()
我的代码使用此功能:
for st in Stadion:
StoreToFile(r'C:\pytest\prod.psr',st)
这就像魅力一样,但是如何将对象放回列表对象?
我有提取对象的代码,但是我无法看到如何遍历对象以将它们放入新列表中。 到目前为止,我有这个:
def ReadFromFile(filename):
infile=None
infile=open(filename,'rb')
objekt=pickle.load(infile)
答案 0 :(得分:2)
for st in Stadion:
StoreToFile(r'C:\pytest\prod.psr',st)
这就像一个魅力。
如果你的意思是“运行没有错误”,那么是的,它确实“有效”。此代码重复覆盖该文件,因此它只包含列表中的最后一项。
请改用:
StoreToFile(r'C:\pytest\prod.psr', Stadion)
你的ReadFromFile()
函数应该可以正常工作并返回一个列表(假设上面的修复)。
也不确定这是做什么的:
return True
if Thefile.close()
答案 1 :(得分:2)
你的代码很愚蠢,utfil = None
业务没有意义,因为open(...)
失败的唯一方法是异常,在这种情况下,函数的其余部分无论如何都不会被执行。正确的方法是使用上下文管理器:with
语句。
相反,请执行:
def storeToFile(path, o):
try:
with open(path, "wb") as f:
pickle.dump(o, f)
return True
except pickle.PicklingError, IOError:
return False
答案 2 :(得分:1)
你应该挑选整个清单。
答案 3 :(得分:0)
要将对象挑选到同一文件,请使用此功能:
def storeToFile(fileName, o):
try:
with open(fileName, "a") as file:
cPickle.dump(o, file)
return True
except pickle.PicklingError, IOError:
return False
请注意,文件以模式"a"
打开,以便将新数据附加到结尾。
要再次加载对象,请使用:
def loadEntireFile(fileName):
try:
with open(fileName) as file:
unpickler = cPickle.Unpickler(file)
while True:
yield unpickler.load()
except EOFError:
pass
此函数尝试从文件中加载对象,直到遇到EOF
,foo = [str(x) for x in range(10)]
for x in foo:
storeToFile("test.pickle", x)
foo2 = list(load("test.pickle"))
表示。您可以像这样使用它:
loadEntireFile
EOFError
函数接受任何list
并从中构建一个列表。函数{{1}}包含iterable语句,使其成为yield
,因此可以将其传递给任何采用迭代的函数。