python处理 dbf文件_python读写dbf文件

importstruct,datetime,decimal,itertools

defdbfreader(f):

"""Returns an iterator over records in a Xbase DBF file.

The first row returned contains the field names.

The second row contains field specs: (type, size, decimal places).

Subsequent rows contain the data records.

If a record is marked as deleted, it is skipped.

File should be opened for binary reads.

"""

# See DBF format spec at:

# http://www.pgts.com.au/download/public/xbase.htm#DBF_STRUCT

numrec,lenheader=struct.unpack('

numfields=(lenheader-33)// 32

fields=[]

forfieldnoinxrange(numfields):

name,typ,size,deci=struct.unpack('<11sc4xBB14x',f.read(32))

name=name.replace('\0','')# eliminate NULs from string

fields.append((name,typ,size,deci))

yield[field[0]forfieldinfields]

yield[tuple(field[1:])forfieldinfields]

terminator=f.read(1)

assertterminator=='\r'

fields.insert(0,('DeletionFlag','C',1,0))

fmt=''.join(['%ds'%fieldinfo[2]forfieldinfoinfields])

fmtsiz=struct.calcsize(fmt)

foriinxrange(numrec):

record=struct.unpack(fmt,f.read(fmtsiz))

ifrecord[0]!=' ':

continue# deleted record

result=[]

for(name,typ,size,deci),valueinitertools.izip(fields,record):

ifname=='DeletionFlag':

continue

iftyp=="N":

value=value.replace('\0','').lstrip()

ifvalue=='':

value=0

elifdeci:

value=decimal.Decimal(value)

else:

value=int(value)

eliftyp=='D':

y,m,d=int(value[:4]),int(value[4:6]),int(val

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值