def __init__(self, f, readOnly=False, new=False, ignoreErrors=False, memoFile=None): """Initialize instance. Arguments: f: Filename or file-like object. readOnly: if ``f`` argument is a string file will be opend in read-only mode; in other cases this argument is ignored. This argument is ignored even if ``new`` argument is True. new: True if new data table must be created. Assume data table exists if this argument is False. ignoreErrors: if set, failing field value conversion will return ``INVALID_VALUE`` instead of raising conversion error. memoFile: optional path to the FPT (memo fields) file. Default is generated from the DBF file name. """ if isinstance(f, basestring): # a filename self.name = f if new: # new table (table file must be # created or opened and truncated) self.stream = file(f, "w+b") else: # table file must exist self.stream = file(f, ("r+b", "rb")[bool(readOnly)]) else: # a stream self.name = getattr(f, "name", "") self.stream = f if new: # if this is a new table, header will be empty self.header = self.HeaderClass() else: # or instantiated using stream self.header = self.HeaderClass.fromStream(self.stream) self.ignoreErrors = ignoreErrors self._new = bool(new) self._changed = False if memoFile: self.memo = memo.MemoFile(memoFile, readOnly=readOnly, new=new) elif self.header.hasMemoField: self.memo = memo.MemoFile(memo.MemoFile.memoFileName(self.name), readOnly=readOnly, new=new) else: self.memo = None self.header.setMemoFile(self.memo)
def addField(self, *defs): """Add field definitions. For more information see `header.DbfHeader.addField`. """ if self._new: self.header.addField(*defs) if self.header.hasMemoField: if not self.memo: self.memo = memo.MemoFile(memo.MemoFile.memoFileName( self.name), new=True) self.header.setMemoFile(self.memo) else: raise TypeError("At least one record was added, " "structure can't be changed")