Python3 CGI脚本接收application/zip格式ZIP文件处理报错求助
解决CGI接收ZIP文件并提取XML的问题
你的问题出在没有将读取到的字节数据包装成类文件对象,且错误调用了zipfile.ZipFile.open方法——ZipFile.open是实例方法,需要先创建ZipFile实例,而非直接传入字节或字符串。
修正步骤
- 用
io.BytesIO将读取到的字节数据包装成可随机访问的类文件对象,因为ZipFile需要能定位文件指针的输入源; - 实例化
ZipFile对象,传入包装后的类文件对象; - 通过
ZipFile.open打开目标XML文件,再传递给pd.read_xml。
修正后的代码
import sys import io import zipfile import pandas as pd # 读取请求体的字节数据 archive_bytes = sys.stdin.buffer.read() # 包装成类文件对象 archive_file = io.BytesIO(archive_bytes) # 实例化ZipFile并打开内部XML with zipfile.ZipFile(archive_file, 'r') as zip_ref: with zip_ref.open("apple_health_export/export.xml") as xml_file: df = pd.read_xml( xml_file, xpath="//Record[contains(@type,'HKQuantity')]", attrs_only=True )
错误原因解释
- 用
sys.stdin.read()得到的是字符串,ZipFile无法直接处理字符串,且字符串没有文件对象的fp属性; - 用
sys.stdin.buffer.read()得到的是字节,但字节同样不是类文件对象,缺少ZipFile所需的文件操作方法(比如seek、特定实现的read); - 必须通过
BytesIO将字节转换为类文件对象,才能被ZipFile正确解析。
内容的提问来源于stack exchange,提问作者Steven Buehler
相关产品推荐
相关产品推荐

