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

Python版Azure Function实现Blob中XML转CSV:查询参数传文件名及排错

问题描述

我需要用Python开发Azure Function,将Azure Blob存储容器中的XML文件转换为CSV文件,要求测试/运行时通过查询参数传入XML文件名和目标CSV文件名。编写相关代码后运行出现500错误,代码如下:

from io import StringIO
import logging
from azure.storage.blob import BlobServiceClient 
import azure.functions as func
import pandas as pd
import requests

constrin = "conn-str"

connection_string = constrin
blob_service_client = BlobServiceClient.from_connection_string(connection_string)
container_client = blob_service_client.get_container_client(r"func-data-01")
fileName = requests.params.get('fileName')
File_Name = container_client.get_blob_client(fileName)


blob = File_Name.download_blob().readall().decode("utf-8") #decode depends on the type of file. UTF is for CSV files.

data = pd.read_csv(StringIO(blob)) #the file will be accessed and the data will be moved to dataframe and can be used further

print(f"file is found an the name is: {File_Name}")


def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    name = req.params.get('name')
    if not name:
        try:
            req_body = req.get_json()
        except ValueError:
            pass
        else:
            name = req_body.get('name')

    if name:
        return func.HttpResponse(f"Hello, {name}. This HTTP triggered function executed successfully.")
    else:
        return func.HttpResponse(
             "This HTTP-triggered function executed successfully. Pass a name in the query string or the request body for a personalized response.",
             status_code=200
        )

测试情况

查询参数设置

查询参数设置截图

报错输出

报错输出截图


问题修复方案

代码核心问题分析

  1. 查询参数获取错误:误用requests.params获取参数,Azure Function应通过req.params获取,且该逻辑写在main函数外,初始化阶段无请求上下文直接报错。
  2. XML读取方式错误:用pd.read_csv读取XML文件,应使用pd.read_xml。
  3. 缺少CSV上传逻辑:未将转换后的CSV文件上传回Blob存储。
  4. 敏感信息硬编码:Blob连接字符串直接写在代码中,不符合安全规范。
  5. 逻辑位置错误:Blob操作核心逻辑在函数外执行,未纳入请求处理流程。

修复后的完整代码

from io import StringIO
import logging
from azure.storage.blob import BlobServiceClient 
import azure.functions as func
import pandas as pd
import os

def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed XML to CSV conversion request.')

    # 从查询参数获取文件名
    xml_file_name = req.params.get('xmlFileName')
    csv_file_name = req.params.get('csvFileName')

    # 参数校验
    if not xml_file_name or not csv_file_name:
        return func.HttpResponse(
             "请传入必填查询参数:xmlFileName(源XML文件名)和csvFileName(目标CSV文件名)",
             status_code=400
        )

    try:
        # 从应用设置读取Blob连接字符串(安全方式)
        connection_string = os.environ.get("AzureBlobStorageConnectionString")
        if not connection_string:
            raise ValueError("未配置Azure Blob存储连接字符串")

        # 初始化Blob客户端
        blob_service_client = BlobServiceClient.from_connection_string(connection_string)
        container_client = blob_service_client.get_container_client("func-data-01")

        # 下载XML文件
        xml_blob_client = container_client.get_blob_client(xml_file_name)
        xml_content = xml_blob_client.download_blob().readall().decode("utf-8")

        # XML转DataFrame
        df = pd.read_xml(StringIO(xml_content))

        # DataFrame转CSV
        csv_output = StringIO()
        df.to_csv(csv_output, index=False, encoding='utf-8')
        csv_output.seek(0)

        # 上传CSV到Blob存储
        csv_blob_client = container_client.get_blob_client(csv_file_name)
        csv_blob_client.upload_blob(csv_output.getvalue(), overwrite=True)

        return func.HttpResponse(
            f"XML文件 {xml_file_name} 已成功转换为CSV文件 {csv_file_name} 并上传到Blob存储",
            status_code=200
        )

    except Exception as e:
        logging.error(f"处理出错:{str(e)}")
        return func.HttpResponse(
            f"转换失败,错误信息:{str(e)}",
            status_code=500
        )

关键修改说明

  • 参数处理:在main函数内通过req.params获取必填参数,并添加校验逻辑。
  • 安全配置:通过os.environ.get从Azure Function应用设置中读取连接字符串,避免硬编码。
  • XML解析:使用pd.read_xml正确解析XML内容。
  • CSV上传:将转换后的CSV内容上传回Blob容器,支持覆盖已有文件。
  • 错误捕获:添加全局异常处理,返回详细错误信息便于排查。

配置与测试步骤

  1. 在Azure Function的配置->应用程序设置中添加AzureBlobStorageConnectionString,值为你的Blob存储连接字符串。
  2. 测试时传入查询参数:xmlFileName=你的XML文件名&csvFileName=目标CSV文件名,确保Blob容器中存在对应XML文件。

内容的提问来源于stack exchange,提问作者Harsh Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 17:55:41