Python 从文件中读取对象,然后转储到文件

Python 从文件中读取对象,然后转储到文件,python,pickle,Python,Pickle,我制作了一个将对象写入文件的函数: 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

我制作了一个将对象写入文件的函数:

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 storeToFile(fileName, o):
    try:
        with open(fileName, "a") as file:
            cPickle.dump(o, file)
            return True
    except pickle.PicklingError, IOError:
        return False
这就像一个符咒,但如何将对象放回列表对象

我有提取对象的代码,但我看不到如何迭代对象以将它们放入新列表中。 到目前为止,我有:

def ReadFromFile(filename):
    infile=None
    infile=open(filename,'rb')
    objekt=pickle.load(infile)

你应该把整个列表都腌掉。

你应该把整个列表腌掉

for st in Stadion:
    StoreToFile(r'C:\pytest\prod.psr',st)
这很有魅力

如果你的意思是“无错误运行”,那么是的,它确实“有效”。此代码会重复覆盖该文件,因此它将只包含列表中的最后一项

改用这个:

StoreToFile(r'C:\pytest\prod.psr', Stadion)
您的
ReadFromFile()
函数应该可以正常工作,并返回一个列表(假设有上述修复)

也不确定这有什么作用:

return True
if Thefile.close()
这很有魅力

如果你的意思是“无错误运行”,那么是的,它确实“有效”。此代码会重复覆盖该文件,因此它将只包含列表中的最后一项

改用这个:

StoreToFile(r'C:\pytest\prod.psr', Stadion)
您的
ReadFromFile()
函数应该可以正常工作,并返回一个列表(假设有上述修复)

也不确定这有什么作用:

return True
if Thefile.close()

您的代码很愚蠢,
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

您的代码很愚蠢,
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

要将对象pickle到同一文件,请使用此函数:

for st in Stadion:
    StoreToFile(r'C:\pytest\prod.psr',st)
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
此函数尝试从文件加载对象,直到遇到由。您可以这样使用它:

foo = [str(x) for x in range(10)]
for x in foo:
    storeToFile("test.pickle", x)

foo2 = list(load("test.pickle"))

该函数接受任意值并从中生成一个列表。函数
LoadEntRefile
包含一条语句,使其成为一个函数,因此可以将其传递给任何使用iterable的函数。

要将对象pickle到同一文件中,请使用此函数:

for st in Stadion:
    StoreToFile(r'C:\pytest\prod.psr',st)
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
此函数尝试从文件加载对象,直到遇到由。您可以这样使用它:

foo = [str(x) for x in range(10)]
for x in foo:
    storeToFile("test.pickle", x)

foo2 = list(load("test.pickle"))

该函数接受任意值并从中生成一个列表。函数
loadEntrefile
包含一条语句,使其成为一个函数,因此可以将其传递给任何使用iterable的函数。

您的意思是什么?我还不知道,另一个答案解释得更清楚。将整个列表传递给StoreToFile,而不是单独存储每个项目。例如:newlist=pickle.load(pickledFile)?您的意思是如何?我还不知道,另一个答案解释得更清楚。将整个列表传递给StoreToFile,而不是单独存储每个项目。例如:newlist=pickle.load(pickledFile)?一些编码建议:请注意,
utfil/infle=None
行是完全无用的,因为它们的值在以下行中被覆盖。还要注意,
return True
后面的两行也从未使用过,因为函数在执行它们之前返回。还请注意,PEP 8建议在参数列表中逗号后使用空格:
dump(object,utfil)
。一些编码建议:请注意,
utfil/infle=None
行是完全无用的,因为它们的值在以下行中被覆盖。还要注意,
return True
后面的两行也从未使用过,因为函数在执行它们之前返回。还要注意,PEP 8建议在参数列表中逗号后使用空格:
dump(object,utfil)
。感谢您的反馈。我根据您的建议更改了代码,但对ReadFromFile有一些问题。如果我尝试list=Readfromfile(filename),这应该会更新列表,或者使用文件中的项目更新一个新列表,但是会出现错误。似乎无法将结果写回。感谢您的反馈。我根据您的建议更改了代码,但对ReadFromFile有一些问题。如果我尝试list=Readfromfile(filename),这应该会更新列表,或者使用文件中的项目更新一个新列表,但是会出现错误。似乎无法将结果写回。