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が何らかの理由でこれを行わない場合でも、OSはとにかくそれを行います。

于 2013-01-17T12:47:16.117 に答える