Azure Blob触发器中使用pandas_read_xml遇AttributeError问题求助
解决Azure Blob触发器中pandas_read_xml处理InputStream的问题
问题分析
你遇到的AttributeError: 'InputStream' object has no attribute 'decode'是因为pandas_read_xml的read_xml方法无法直接识别Azure Functions的func.InputStream对象;而你尝试的BytesIO方法失败,核心原因是流读取后指针停在末尾,导致read_xml无法读取到内容。
解决方案
方案1:直接处理InputStream(推荐,无需重复下载)
利用func.InputStream的read()方法获取字节内容,包装为BytesIO后重置指针即可:
import logging import azure.functions as func import pandas_read_xml as pdx from io import BytesIO def main(myblob: func.InputStream): logging.info(f"Python blob trigger function processed blob \n" f"Name: {myblob.name}\n" f"Blob Size: {myblob.length} bytes") # 读取Blob字节内容并包装为可读取的流 blob_bytes = myblob.read() xml_stream = BytesIO(blob_bytes) # 重置流指针到开头,确保read_xml能读取到内容 xml_stream.seek(0) # 解析XML为DataFrame并扁平化 df = pdx.read_xml(xml_stream) df = pdx.fully_flatten(df) # 这里添加你的后续处理逻辑(如保存到数据库、输出等) logging.info(f"Flattened DataFrame shape: {df.shape}")
方案2:优化你的BytesIO下载方法
如果必须重新通过Blob Client下载,只需在readinto后添加seek(0)重置指针:
import logging import azure.functions as func import pandas_read_xml as pdx from io import BytesIO from azure.storage.blob import ContainerClient def main(myblob: func.InputStream): logging.info(f"Python blob trigger function processed blob \n" f"Name: {myblob.name}\n" f"Blob Size: {myblob.length} bytes") blob_name = myblob.name container_str_url = 'REDACTED' container_client = ContainerClient.from_container_url(container_str_url) blob_client = container_client.get_blob_client(blob=blob_name) stream_downloader = blob_client.download_blob() stream = BytesIO() stream_downloader.readinto(stream) # 关键步骤:将流指针移到开头 stream.seek(0) # 解析XML并扁平化 df = pdx.read_xml(stream) df = pdx.fully_flatten(df) # 后续处理逻辑 logging.info(f"Flattened DataFrame shape: {df.shape}")
特殊编码处理(如果XML非UTF-8)
如果你的XML文件使用了非UTF-8编码(如GB2312、GBK),需要先解码为字符串再用StringIO包装:
from io import StringIO # 替换为你的XML实际编码 blob_content = myblob.read().decode('gb2312') xml_stream = StringIO(blob_content) df = pdx.read_xml(xml_stream)
内容的提问来源于stack exchange,提问作者BlakeB9
相关产品推荐
相关产品推荐

