dbfpy - cannot store new record

Laszlo Nagy gandalf at shopzeus.com
Thu May 21 10:25:12 EDT 2009


David Lyon írta:
> Hi,
>
> Try not opening the file in append mode (no "a+")
>
> Inside the logic, there is already a seek to the end of the file
> and the record counters at the start of the file need updating
> too.
>   
The first thing I tried is to use a filename instead of the file object 
but it didn't work. Then I just tried "r+b" and it worked fine. Thank you!

BTW here is ist constructor:

    def __init__(self, f, readOnly=False, new=False, ignoreErrors=False):
        """Initialize instance.

        Arguments:
            f:
                Filename or file-like object.
            new:
                True if new data table must be created. Assume
                data table exists if this argument is False.
            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.
            headerObj:
                `header.DbfHeader` instance or None. If this argument
                is None, new empty header will be used with the
                all fields set by default.
            ignoreErrors:
                if set, failing field value conversion will return
                ``INVALID_VALUE`` instead of raising conversion error.

        """
        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:
                # tabe file must exist
                self.stream = file(f, ("r+b", "rb")[bool(readOnly)])
        else:
            # a stream
            self.name = getattr(f, "name", "")
            self.stream = f


I have never seen such a construct before. Index a tuple with a boolean???

                self.stream = file(f, ("r+b", "rb")[bool(readOnly)])
Best,

   Laszlo




More information about the Python-list mailing list