0

我正在编写一个程序来打开一个用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)
4

1 回答 1

1

它已经在记忆中。加载泡菜会返回一个 python 结构。

此外,StringIO对象是内存中类似文件的对象,而不是 Python 对象结构。您不能将 python 结构的内存表示并将其“写入”到内存中,而是指示 Python 解释器为您构造这些对象(这是pickle模块为您所做的)。

最后但并非最不重要的一点是,您确实应该避免使用atexit来关闭文件。Python 退出时仍然打开的文件对象会自动关闭。即使 Python 出于某种原因没有这样做,操作系统也会这样做。

于 2013-01-17T12:47:16.117 回答