如何在不提取 Python 的情况下将 zip 文件中的 DBF 文件加载到变量中?

How to load a DBF file within a zip file to a variable without extracting it in Python?

提问人:David H. J. 提问时间:11/9/2023 更新时间:11/10/2023 访问量:24

问:

我正在尝试将 zip 文件中包含的 DBF 文件加载到变量中,而不提取 zip 文件。我尝试使用以下代码,但它不起作用:

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')

此代码不起作用,因为它尝试使用 DBF 构造函数从 zip 文件中读取 DBF 文件,该构造函数需要文件对象作为输入。但是,ZipFile 类的 open() 方法返回一个 ZipExtFile 对象,该对象不是文件对象。

如何在不提取 zip 文件的情况下将 DBF 文件加载到变量中?

python dbf python-zip文件

评论


答:

0赞 Marco Bonelli 11/10/2023 #1

看起来你不能。您使用的库需要文件名作为 的第一个参数,然后尝试打开并读取文件本身。而且,该类似乎在内部函数中多次打开和读取文件,因此您不能只创建一个临时文件并在实例化后将其删除。不幸的是,这很傻。DBS()DBSDBS(filename)

您必须将文件解压缩到磁盘或创建一个 NamedTemporaryFile,将数据写入其中并将其名称传递给 。不过,该文件应该与您使用的类一样长。DBSDBS

总的来说,我会说这个库提供了一个非常糟糕的界面,底层文件甚至可能会更改,并且库会在更改后重新打开它,我不确定这是人们通常所期望的。