Peter Otten <[EMAIL PROTECTED]> wrote: > Alex Martelli wrote: > > > BTW, if you DO want to call shelve.open on a path f that may correspond > > to an arbitrary existing file (and want to toss away the previous > > contents of that file, if any) the correct way to call is then: > > > > s = shelve.open(whatever_path, 'n') > > > > since 'n' truncates an existing file, or creates a new one, as needed. > > It's not entirely arbitrary since you get an exception if that file is not a > valid database: > > >>> open("tmp.db", "w").write("garbage") > >>> import shelve > >>> shelve.open("tmp.db", "n") > Traceback (most recent call last): > File "<stdin>", line 1, in <module> > File "/usr/local/lib/python2.5/shelve.py", line 225, in open > return DbfilenameShelf(filename, flag, protocol, writeback) > File "/usr/local/lib/python2.5/shelve.py", line 209, in __init__ > Shelf.__init__(self, anydbm.open(filename, flag), protocol, writeback) > File "/usr/local/lib/python2.5/anydbm.py", line 80, in open > raise error, "db type could not be determined" > anydbm.error: db type could not be determined
You're right -- anydbm.open, even when asked to "truncate the file", still does mandate that the file, if it exists, be in some proper DBM format (to determine which DBM module it will use to open it). This is not intuitive, and needs to be mentioned in the Nutshell. Alex -- http://mail.python.org/mailman/listinfo/python-list