1

Python 2.7.2 で shelve 標準 lib を使用して、永続的なデータ ファイルを作成し、すぐに印刷用に開くための非常に簡単なテストを作成しました。

import os
import shelve

shelf_filename = str(__file__.split('.')[0] + '.dat')

#delete the shelf file if it exists already.
try:
    os.remove(shelf_filename)
    print "DELETED LEFTOVER SHELF FILE", shelf_filename
except OSError:
    pass

#create a new shelf, write some data, and flush it to disk
shelf_handle = shelve.open(shelf_filename)
print "OPENED", shelf_filename, "WITH SHELF"
shelf_handle['foo'] = 'bar'
shelf_handle.close()
print "FLUSHED AND CLOSED THE SHELF"

#re-open the shelf we just wrote, read/print the data, and close it
shelf_handle = shelve.open(shelf_filename)
print "RE-OPENED", shelf_filename, "WITH SHELF"
print 'foo:', shelf_handle.get('foo')
shelf_handle.close()

#delete the shelf file
os.remove(shelf_filename)

ただし、このスクリプトは、作成したばかりのシェルフを再度開こうとすると予期せず失敗します。

DELETED LEFTOVER SHELF FILE shelve_test.dat
OPENED shelve_test.dat WITH SHELF
FLUSHED AND CLOSED THE SHELF
Traceback (most recent call last):
  File "shelve_test.py", line 21, in <module>
    shelf_handle = shelve.open(shelf_filename)
  File ".../shelve.py", line 239, in open
    return DbfilenameShelf(filename, flag, protocol, writeback)
  File ".../shelve.py", line 223, in __init__
    Shelf.__init__(self, anydbm.open(filename, flag), protocol, writeback)
  File ".../anydbm.py", line 82, in open
    raise error, "db type could not be determined"
anydbm.error: db type could not be determined

これはシェルブの最も基本的な使用法に関するものなので、何が欠けているのか本当にわかりません。私の知る限り、ドキュメントを手紙に従っています。棚上げの経験が少しある人は、何が起こっているのか教えてもらえますか?

更新: このスクリプトは特定のプラットフォームでは機能するようですが、他のプラットフォームでは機能しないようです。これは、Python の標準ライブラリとしては驚くべきことです。これが機能しないことを確実に確認しました:

Python 2.7.2 (default, May 15 2013, 13:46:05) 
[GCC 4.2.1 Compatible Apple LLVM 4.2 (clang-425.0.28)] on darwin
4

2 に答える 2

2

このバージョンの Python shelve は非推奨の dbm パッケージを使用しており、次のように別の dbm を指定することで問題を解決できます。

import anydbm
anydbm._defaultmod = __import__('dumbdbm')

これらの 2 行を上記のスクリプトに追加すると、すべてが期待どおりに機能します。これは本当に棚で修正する必要があります。

于 2013-09-23T00:29:25.220 に答える
1

shelveファイル名に拡張子を指定する必要はありません。代わりに、ファイルの作成に使用されたデータベースに基づいてファイルに拡張子を付けます。

したがって、 を呼び出すと、を使用して作成されるはずshelve.open("shelve_test.dat")のファイルが作成されますが、別の (より優れた) データベース マネージャーで作成されます。shelvedumbdbm

代わりに、 を呼び出す必要があります。そうすればshelve.open("shelve_test")shelve正しい拡張子を使用してファイルを保存することを選択できます。これは、作成済みのファイルを開く場合にも適用されます。

于 2013-10-09T21:13:30.127 に答える