我正在编写一个打开用pickle保存的数据库文件的程序。 但如果我想用StringIO / cStringIO将文件中的列表加载到内存中,它会说:
Opening database...
Loading database into memory...
Traceback (most recent call last):
...
File "C:\myfile.py", line 17 in open_database
database.write(databasefile)
TypeError: must be string or read-only character buffer, not list
这是我的代码:
def open_database(self):
print("Opening database...")
databasefile = open('database.dat', "r")
databasecontent = cPickle.load(databasefile)
databasefile.close()
print('Loading database into memory...')
database = cStringIO.StringIO()
database.write(databasecontent)
atexit.register(close_database)
答案 0 :(得分:1)
它已经在记忆中了。加载pickle返回python结构。
此外,StringIO
对象是内存中类文件对象,而不是Python对象结构。您无法获取python结构的内存中表示并将其“写入”内存,您指示Python解释器为您构造这些对象(这是pickle
模块为您执行的操作)。
最后但并非最不重要的是,您真的应该避免使用atexit
来关闭文件。 Python退出时仍然打开的文件对象会自动关闭。即使Python出于某种原因不这样做,操作系统也会这样做。