5

i want to work with dbf Files on Python 3.7 with dbfread Module, it works with a small dbf

from dbfread import DBF from struct import * table = DBF('usuarios.dbf', load=True) for item in table: print (item) 

Output:

OrderedDict([('NUMUSER', ' 0'), ('NOMUSER', 'Rosy'), ('PASSWORD', ''), ('NIVEL', 'SUPER'), ('VALIDAR', 'P?@qMwá¿|Ew}"Q-JW0Q0:iw^'), ('EMAIL', '[email protected]|'), ('MAILTIPO', 1), ('MAILFIRMA', None), ('MAILSMTP', 'Ghf2U*wT3Ik?D#>W0@+9@," ¡.deZ+%¿i?GL0oBrO+éZ=KwXw{E(LXIv#ñOññW+t"AruéñAm\\O>YB$iTNv*\'Ñé2).*qv#88XZ5k%KK%R}~¡oOgiTó\'=#'), ('HUELLA1', None), ('HUELLA2', None), ('METODO', 0), ('ACTIVO', True)]) [Finished in 0.2s] 

but when i try with a large dbf it shows error

from dbfread import DBF from struct import * table = DBF('docum.dbf', load=True) for item in table: print (item) 

Output2:

Traceback (most recent call last): File "C:\Users\user\rdbfs.py", line 4, in <module> table = DBF('docum.dbf', load=True) File "C:\Python3\lib\site-packages\dbfread\dbf.py", line 121, in __init__ self._read_header(infile) File "C:\Python3\lib\site-packages\dbfread\dbf.py", line 206, in _read_header self.header = DBFHeader.read(infile) File "C:\Python3\lib\site-packages\dbfread\struct_parser.py", line 41, in read return self.unpack(file.read(self.struct.size)) File "C:\Python3\lib\site-packages\dbfread\struct_parser.py", line 36, in unpack items = zip(self.names, self.struct.unpack(data)) struct.error: unpack requires a buffer of 32 bytes [Finished in 0.2s with exit code 1] 

i don't know about pack or unpack data in python, can you help me guys? or give guideance. Thanks!

2 Answers 2

2

I don't use dbfread myself, so I don't know why it's not working.

You can try using my library, dbf, which would look like:

import dbf table = dbf.Table('usuarios.dbf') table.open() for item in table: print item record = table[0] # first record print record.numuser print record.nomuser 
Sign up to request clarification or add additional context in comments.

3 Comments

I know this is late, but can I use this dbf module with Python3
@RahalKanishka: Yes, you can. The above example would be using the function form of print, so print(item) and print(record.numuser).
Thanks, I was struggling to set up dbf for python 3. And I finally set it up and tried your code and it worked :)
0

it works!!

 import dbf ruta = 'Y:/SAITBC/' table = dbf.Table(ruta+'clientes.dbf') tablita = table.open() print(tablita) #for item in tablita: # print(item) record = tablita[0] print (record['nomcli']) 

output:

 Table: Y:/SAITBC/clientes.dbf Type: Foxpro Codepage: cp1252 (Windows ANSI) Status: DbfStatus.READ_ONLY Last updated: 2018-12-20 Record count: 1282 Field count: 79 Record length: 1230 --Fields-- 0) numcli C(5) 1) nomcli C(200) 2) calle C(60) 3) numext C(10) 4) colonia C(60) 5) ciudad C(30) 6) estado C(20) 7) cp C(10) 8) telefono C(30) 9) fax C(20) 10) clasif C(5) 11) ventano N(12,2) 12) ultvent D 13) atvent C(40) 14) atcobr C(40) 15) rfc C(13) 16) limcred N(12,2) 17) saldo N(12,2) 18) pjedesc N(5,2) 19) diascred N(3,0) 20) precioutil C(1) 21) recepfac C(30) 22) pagofac C(30) 23) obs M 24) email1 C(40) 25) email2 C(40) 26) numcta C(20) 27) uid N(10,0) 28) numvend C(5) 29) obligareq L 30) suspendido L 31) bloqueasop L 32) direnvio M 33) otrosdatos M 34) impuesto1 N(6,2) 35) retencion1 N(10,4) 36) retencion2 N(6,2) 37) permitecod L 38) llavecred L 39) tiposop C(10) 40) clavecli C(20) 41) curp C(20) 42) pais C(15) 43) nomcomer C(40) 44) cfgdatdoc M 45) datosfe M 46) statusweb N(1,0) 47) claveweb C(32) 48) numzona C(5) 49) metodopago M 50) metodousar C(2) 51) tiposys C(10) 52) licencia N(10,0) 53) ncontra C(10) 54) pass C(10) 55) rsocial N(10,0) 56) usanom L 57) contnomi C(10) 58) passnom C(10) 59) numint C(10) 60) cosac C(2) 61) modi L 62) altasg D 63) usocfdi C(3) 64) formapago C(2) 65) fechanac D 66) pjepuntos N(5,2) 67) pjedescmes N(5,2) 68) pjedescdia N(5,2) 69) implocal M 70) poliza C(10) 71) vencsait D 72) usaenl L 73) vencnom D 74) rsocnom N(10,2) 75) usabov L 76) vencbov D 77) tiponom C(20) 78) condpago C(30) 

PEÑUELAS TAPIA JAIME ROJO
[Finished in 0.4s]

4 Comments

Because this isn't a actual answer, please delete it once we have this figured out.
thnx i'll delete it, i just wanted to show you my error, i didn't know how.. srry
No worries. New users can't do much so it was a good way to show the problems you were having.
Thank you so much!

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.