Python中的Pickle与文件输出的比较

10 投票
3 回答
15505 浏览
提问于 2025-04-16 03:24

我有一个程序,它会输出一些列表,我想把这些列表存起来,以便以后使用。比如说,它输出了一份学生名字的列表,还有一份他们期中考试成绩的列表。我可以用以下两种方式来存储这些输出:

标准文件输出方式:

newFile = open('trialWrite1.py','w')
newFile.write(str(firstNames))
newFile.write(str(midterm1Scores))
newFile.close()

使用pickle的方式:

newFile = open('trialWrite2.txt','w')
cPickle.dump(firstNames, newFile)
cPickle.dump(midterm1Scores, newFile)
newFile.close()

哪种方法更好或者更受欢迎呢?使用其中一种有什么好处吗?

谢谢

3 个回答

0

如果你想尝试一种完全不同的方法,可以考虑一下 Python自带了SQLite。这意味着你可以把数据存储在一个SQL数据库里,而不需要额外安装任何第三方的工具。

3

pickle 是一种比较通用的方法,它可以把很多不同类型的对象保存到文件中,以便以后使用。不过,它的缺点是保存的内容不太容易被人看懂,而且也不是一个标准的格式。

而把字符串写入文件则更适合与其他活动或代码进行交互。但这样做的代价是,你需要再把文本解析回你的 Python 对象。

对于这种简单的数据(比如列表),两种方法都可以用;我会选择用 write( firstNames ),因为没有必要使用 pickle。一般来说,如何把数据保存到文件系统上,取决于你要保存的数据类型!


举个例子,pickle 可以轻松地保存函数,而仅仅通过写字符串是做不到的。

>>> data = range
<class 'range'>
>>> pickle.dump( data, foo )
# stuff
>>> pickle.load( open( ..., "rb" ) )
<class 'range'.
6

我觉得 csv 模块在这里可能很合适,因为CSV是一种标准格式,Python(还有很多其他编程语言)都可以读取和写入,而且它也很容易被人理解。使用起来可能就像这样:

with open('trialWrite1.py','wb') as fileobj:
    newFile = csv.writer(fileobj)
    newFile.writerow(firstNames)
    newFile.writerow(midterm1Scores)

不过,把每个学生的信息写在一行上,包括他们的名字和分数,可能会更合理。可以这样做:

from itertools import izip
with open('trialWrite1.py','wb') as fileobj:
    newFile = csv.writer(fileobj)
    for row in izip(firstNames, midterm1Scores):
        newFile.writerow(row)

撰写回答