Beispiel #1
0
    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)
Beispiel #2
0
    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")