如何在Python中无需解压直接读取Zip内的DBF文件到变量?
不解压Zip文件加载DBF文件到变量的解决方案
问题背景
尝试直接读取压缩在Zip文件中的DBF文件到变量(无需解压到磁盘),但原代码因zipfile.ZipFile.open()返回的ZipExtFile对象不支持dbfread.DBF所需的随机访问(seek()方法)而报错。
原错误代码
import zipfile from dbfread import DBF def load_dbf_from_zip(zip_filename): with zipfile.ZipFile(zip_filename, 'r') as z: dbf_filename = z.namelist()[0] with z.open(dbf_filename) as f: dbf = DBF(f) return dbf dbf = load_dbf_from_zip('my_zip_file.zip')
解决方案
将Zip内的DBF文件内容读取到io.BytesIO字节流对象中,该对象支持随机访问,可被DBF构造函数正常处理:
import zipfile from dbfread import DBF import io def load_dbf_from_zip(zip_filename): with zipfile.ZipFile(zip_filename, 'r') as z: # 若Zip内有多个文件,需替换为目标DBF文件名,而非取第一个 dbf_filename = z.namelist()[0] # 读取DBF文件的字节内容 dbf_raw_data = z.read(dbf_filename) # 包装为支持随机访问的类文件对象 with io.BytesIO(dbf_raw_data) as dbf_file: # 若DBF有编码问题,可添加encoding参数,如encoding='gbk' dbf = DBF(dbf_file) return dbf # 调用示例 dbf = load_dbf_from_zip('my_zip_file.zip')
关键说明
zipfile.ZipFile.read()直接读取Zip内文件的字节内容,避免生成磁盘文件io.BytesIO将字节内容封装为支持seek()和tell()的类文件对象,满足dbfread.DBF的读取要求- 若Zip内包含多个DBF文件,需修改
dbf_filename的获取逻辑,指定具体文件名而非默认取第一个
内容的提问来源于stack exchange,提问作者David H. J.
相关产品推荐
相关产品推荐

