使用cPickle时遇到问题
你能帮我让这个例子运行起来吗?
我想要加载一个已经保存好的字典(就是一种数据结构),如果它存在的话,然后对它进行修改,再把它保存回去。我觉得我在打开文件时使用的模式可能有问题,但我不知道正确的方式是什么。
import os
import cPickle as pickle
if os.path.isfile('file.txt'):
cache_file = open('file.txt', 'rwb')
cache = pickle.load(cache_file)
else:
cache_file = open('file.txt', 'wb')
cache = dict.fromkeys([1,2,3])
# modifications of cache
pickle.dump(cache, cache_file)
cache_file.close()
运行两次看看错误:
Traceback (most recent call last):
File "example.py", line 11, in <module>
pickle.dump(cache, cache_file)
IOError: [Errno 9] Bad file descriptor
3 个回答
1
你打开了一个文件,可以同时读取和写入,也就是可以随意访问这个文件。当你第一次读取文件时,文件的指针会停在文件的末尾,所以当你之后再写数据的时候,其实是在文件的最后面添加内容。
正确的做法是先以只读的方式打开文件,读取数据后关闭它,然后再以写入的方式重新打开文件。
5
'rwb'
这个文件打开模式是不正确的,应该使用 'r+b'
。
而且,当你从文件中读取数据后,光标会停在文件的末尾,所以如果你用 pickle.dump(cache, cache_file)
来写入数据,它会在文件末尾追加内容(这可能不是你想要的结果)。在使用 pickle.load(cache_file)
读取文件后,试试 cache_file.seek(0)
来把光标移回文件开头。
4
每次加载文件的时候,你需要先打开文件(用模式'mode='rb'),然后加载内容,最后关闭文件。
每次保存文件的时候,你需要先打开文件(用模式'mode='wb'),然后保存内容,最后关闭文件。