Загрузить список в память с помощью Python? или это уже в памяти?

Я пишу программу, которая открывает файл базы данных, сохраненный с 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)

1 ответ

Решение

Это уже в памяти. Загрузка рассола возвращает структуру Python.

Кроме того, StringIO Объект - это файловый объект в памяти, а не структура объекта Python. Вы не можете взять в памяти представление структуры Python и "записать" ее в память, вы указываете интерпретатору Python создать эти объекты для вас (что и является pickle модуль делает для вас).

Не в последнюю очередь, вы действительно должны избегать использования atexit закрыть файлы. Файловые объекты, которые остаются открытыми при выходе из Python, автоматически закрываются. Даже если Python по какой-то причине этого не делает, ОС все равно сделает это.

Другие вопросы по тегам