[Python-checkins] r69327 - sandbox/trunk/dbm_sqlite/alt/dbdict.py

raymond.hettinger python-checkins at python.org
Fri Feb 6 01:38:48 CET 2009


Author: raymond.hettinger
Date: Fri Feb  6 01:38:48 2009
New Revision: 69327

Log:
Auto search input file formats.

Modified:
   sandbox/trunk/dbm_sqlite/alt/dbdict.py

Modified: sandbox/trunk/dbm_sqlite/alt/dbdict.py
==============================================================================
--- sandbox/trunk/dbm_sqlite/alt/dbdict.py	(original)
+++ sandbox/trunk/dbm_sqlite/alt/dbdict.py	Fri Feb  6 01:38:48 2009
@@ -5,7 +5,8 @@
 close time's are potentially long because the whole dict must be
 read or written to disk.
 
-File format is selectable between pickle, json, eval, and csv.
+Input file format is automatically discovered.
+Output file format is selectable between pickle, json, and csv.
 All three are backed by fast C implementations.
 
 '''
@@ -15,16 +16,18 @@
 
 class DictDB(dict):
 
-    def __init__(self, filename, flag='c', mode=None, format='csv', *args, **kwds):
-        # r=readonly   c=read_write_create_if_needed   n=new_overwrite_previous
+    def __init__(self, filename, flag='c', mode=None, format=None, *args, **kwds):
+        # flags:    r=readonly   c=create   n=new_overwrite_previous
+        # mode:     None or a triple like 0x666
+        # format:  csv, json, or pickle (default is csv)
         self.flag = flag
         self.mode = mode
-        self.format = format
+        self.format = format or 'csv'
         self.filename = filename
         if flag != 'n' and os.access(filename, os.R_OK):
             file = __builtins__.open(filename, 'rb')
             try:
-                self.update(self.load(file))
+                self.load(file)
             finally:
                 file.close()
         self.update(*args, **kwds)
@@ -42,40 +45,34 @@
                 raise
             file.close()
             shutil.move(file.name, self.filename)    # atomic commit
-            if self.mode:
+            if self.mode is not None:
                 os.chmod(self.filename, self.mode)
 
     def close(self):
         self.sync()
 
-    def dump(self, f):
+    def dump(self, file):
         if self.format == 'csv':
-            csv.writer(f).writerows(self.iteritems())
+            csv.writer(file).writerows(self.iteritems())
         elif self.format == 'json':
-            json.dump(self, f, separators=(',',':'))
+            json.dump(self, file, separators=(',',':'))
         elif self.format == 'pickle':
-            pickle.dump(self.items(), f, -1)
-        elif self.format == 'eval':
-            f.write(repr(self))
+            pickle.dump(self.items(), file, -1)
         else:
             raise NotImplementedError('Unknown format: %r' % self.format)
 
-    def load(self, f):
-        # Use csv or json for untrusted data.  Handles only basic types.
-        # Use pickle or eval only for trusted.  Handles many object types.
-        if self.format == 'csv':
-            return csv.reader(f)
-        elif self.format == 'json':
-            return json.load(f)
-        elif self.format == 'pickle':
-            return pickle.load(f)
-        elif self.format == 'eval':
-            return eval(f.read())
-        else:
-            raise NotImplementedError('Unknown format: %r' % self.format)
+    def load(self, file):
+        # try formats from most restrictive to least restrictive
+        for loader in (pickle.load, json.load, csv.reader):
+            file.seek(0)
+            try:
+                return self.update(loader(file))
+            except Exception:
+                pass
+        raise NotImplementedError('Unknown format: %r' % self.format)
 
 
-def dbopen(filename, flag='c', mode=0o666, format='csv'):
+def dbopen(filename, flag='c', mode=None, format=None):
     return DictDB(filename, flag, mode, format)
 
 


More information about the Python-checkins mailing list