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 )
测试情况
查询参数设置

报错输出

问题修复方案
代码核心问题分析
- 查询参数获取错误:误用
requests.params获取参数,Azure Function应通过req.params获取,且该逻辑写在main函数外,初始化阶段无请求上下文直接报错。 - XML读取方式错误:用
pd.read_csv读取XML文件,应使用pd.read_xml。 - 缺少CSV上传逻辑:未将转换后的CSV文件上传回Blob存储。
- 敏感信息硬编码:Blob连接字符串直接写在代码中,不符合安全规范。
- 逻辑位置错误: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容器,支持覆盖已有文件。
- 错误捕获:添加全局异常处理,返回详细错误信息便于排查。
配置与测试步骤
- 在Azure Function的配置->应用程序设置中添加
AzureBlobStorageConnectionString,值为你的Blob存储连接字符串。 - 测试时传入查询参数:
xmlFileName=你的XML文件名&csvFileName=目标CSV文件名,确保Blob容器中存在对应XML文件。
内容的提问来源于stack exchange,提问作者Harsh Kumar
相关产品推荐
相关产品推荐

