[Tutor] Unpack requires a string argument of length 8

Jim Richardson weaselkeeper at gmail.com
Wed May 4 06:25:27 CEST 2011


On Mon, May 2, 2011 at 1:17 PM, Marc Tompkins <marc.tompkins at gmail.com> wrote:
> On Mon, May 2, 2011 at 12:36 PM, Susana Iraiis Delgado Rodriguez
> <susana.delgado_s at utzmg.edu.mx> wrote:
>>
>> I'm working on getting information that comes from a dbf file (database),
>> this dbf file is related to another file in the system, a shapefile. My code
>> is trying to get all the dbf name records, but when the systen gets an empty
>> file, my code fails:
>> Traceback (most recent call last):
>>   File "<stdin>", line 1, in <module>
>>   File "get_dbf.py", line 32, in <module>
>>     dbf = Dbf(d,new=False, readOnly=True)
>>   File "C:\Python26\lib\site-packages\dbf.py", line 135, in __init_
>>     self.header = self.HeaderClass.fromStream(self.stream)
>>   File "C:\Python26\lib\site-packages\header.py", line 109, in from
>>     (_cnt, _hdrLen, _recLen) = struct.unpack("<I2H", _data[4:12])
>> struct.error: unpack requires a string argument of length 8
>> >>>
>> How can I fix it?
>
> You said that this happens when you're trying to process an empty file.  If
> that's the case, then I would certainly expect this: "_data[4:12]"  not to
> return a string of length 8!
>
> So you have two options:
> - "Get permission"
>>
>> if (some check to make sure the file isn't empty):
>>     dbf = Dbf(d,new=False, readOnly=True)
>
> or
> - "Ask forgiveness".
>>
>> try:
>>     dbf = Dbf(d,new=False, readOnly=True)
>> except:
>>     (cleanup code to handle aborted file opening)
>>
>
> Which is correct?  That depends on your own preference, and also on how
> often the error occurs.  If you rarely run across empty files, then "ask
> forgiveness" makes more sense, since otherwise you waste time checking for
> an error that hardly ever happens; on the other hand, if you run into lots
> of empty files, then it makes sense to check first, each time.


Also, the first option does leave the possibility of a race condition,
however slim that might be.

Personally, I'd use the try/except pair, and optimize later if it
turned out to be an issue.

-- 
http://neon-buddha.net


More information about the Tutor mailing list