You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 12:35:19