如何获取requests.get()返回的二进制Excel数据的工作表数量及扩展名?
爬取Excel文件:获取工作表总数与确定文件扩展名
1. 获取未知数量的Excel工作表
不用提前硬编码工作表数量,直接用pandas.ExcelFile加载二进制响应内容,就能拿到所有工作表的信息:
import pandas as pd # 把二进制响应内容加载为ExcelFile对象 excel_handler = pd.ExcelFile(res.content) # 获取所有工作表名称的列表 all_sheets = excel_handler.sheet_names # 工作表总数就是列表长度 total_sheets = len(all_sheets) # 循环遍历每个工作表并保存 for sheet_name in all_sheets: df = excel_handler.parse(sheet_name) df.to_excel(f"{db}{sheet_name}.xlsx", index=False) # 建议加上index=False避免保存索引列
这种方式不仅能拿到总数,还能直接用工作表的真实名称命名输出文件,比用索引循环更直观可靠。
2. 确定二进制数据的正确扩展名
如果不知道下载的二进制文件是什么格式,可以通过两种方式判断:
方式一:从响应头获取类型
服务器返回的Content-Type响应头通常会标明文件类型,我们可以做映射匹配:
# 提取响应头里的Content-Type content_type = res.headers.get('Content-Type', '') # 常见表格文件的Content-Type与扩展名映射 type_ext_map = { 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': '.xlsx', 'application/vnd.ms-excel': '.xls', 'text/csv': '.csv', 'text/plain': '.txt' } # 获取对应扩展名,默认返回.unknown file_ext = type_ext_map.get(content_type.split(';')[0], '.unknown')
注意有些Content-Type会带额外参数(比如charset=utf-8),所以用split(';')[0]只取主类型。
方式二:通过文件签名(Magic Number)识别
如果响应头信息不准确,可以读取二进制数据的前几个字节(文件签名)来判断,这是更可靠的方式:
def detect_file_extension(byte_content): # 检查二进制内容的开头字节(文件签名) if byte_content.startswith(b'PK\x03\x04'): # PK开头是ZIP压缩格式,xlsx本质是压缩包 return '.xlsx' elif byte_content.startswith(b'D\x00\xCF\x11\xE0\xA1\xB1\x1A\xE1\x00'): # 旧版xls文件的签名 return '.xls' elif byte_content.startswith(b'\xef\xbb\xbf'): # UTF-8 BOM开头,可能是CSV或文本文件 sample = byte_content[:100].decode('utf-8') return '.csv' if ',' in sample else '.txt' else: return '.unknown' file_ext = detect_file_extension(res.content)
内容的提问来源于stack exchange,提问作者github_yodaum
相关产品推荐
相关产品推荐

