如何用Python获取ADLS Gen2文件最后修改日期并存储为CSV
问题排查
你原来的代码存在两个核心问题:
- 路径字符串使用反斜杠
\,Python解析时会把\t这类组合识别为转义字符,同时Azure ADLS的路径规范要求使用正斜杠/作为分隔符 blob.properties.last_modified是Blob/File客户端实例的只读属性,不是可调用方法,不需要传入路径参数,你需要先根据路径初始化对应的文件客户端再读取该属性
解决步骤
1. 安装依赖包
pip install azure-storage-file-datalake pandas
2. 路径预处理
所有输入的字符串路径先统一替换反斜杠为正斜杠,或者使用原始字符串避免转义问题:
# 原始输入路径 raw_path = r'teams\test\A.json' # 转换为ADLS兼容的路径格式 adls_file_path = raw_path.replace('\\', '/')
3. 完整实现代码
以下代码适配ADLS Gen2场景,支持获取单个/批量文件最后修改时间,最终写入目标容器的CSV文件:
from azure.storage.filedatalake import DataLakeServiceClient import pandas as pd # 配置项 STORAGE_ACCOUNT_NAME = "替换为你的存储账户名" SOURCE_CONTAINER = "替换为源文件所在的容器名" TARGET_CONTAINER = "替换为存储CSV的目标容器名" TARGET_CSV_PATH = "file_modify_records.csv" # 存储账户连接字符串,可在Azure门户存储账户的"访问密钥"页面获取 CONN_STR = "替换为你的存储账户连接字符串" # 初始化ADLS服务客户端 service_client = DataLakeServiceClient.from_connection_string(CONN_STR) source_fs_client = service_client.get_file_system_client(SOURCE_CONTAINER) # ----- 单个文件场景 ----- # 初始化文件客户端 file_client = source_fs_client.get_file_client(adls_file_path) # 获取文件属性 file_props = file_client.get_file_properties() last_modified = file_props.last_modified.strftime("%Y-%m-%d %H:%M:%S UTC") # 构造输出数据 records = [ { "file_path": adls_file_path, "last_modified_time": last_modified } ] # ----- 批量文件场景(可选)----- # 如果需要处理多个路径,遍历路径列表即可 # file_paths = [r'teams\test\A.json', r'teams\test\B.json', ...] # records = [] # for raw_path in file_paths: # adls_path = raw_path.replace('\\', '/') # file_client = source_fs_client.get_file_client(adls_path) # props = file_client.get_file_properties() # records.append({ # "file_path": adls_path, # "last_modified_time": props.last_modified.strftime("%Y-%m-%d %H:%M:%S UTC") # }) # 写入CSV并上传到目标容器 df = pd.DataFrame(records) csv_content = df.to_csv(index=False, encoding="utf-8").encode("utf-8") target_file_client = service_client.get_file_system_client(TARGET_CONTAINER).get_file_client(TARGET_CSV_PATH) target_file_client.upload_data(csv_content, overwrite=True)
注意事项
- 身份验证除了使用连接字符串外,生产环境推荐使用托管身份,避免硬编码密钥
- 如果使用的是ADLS Gen1,需要替换为
azure-mgmt-datalake-store包对应的接口逻辑
内容的提问来源于stack exchange,提问作者Gorib_coder
相关产品推荐
相关产品推荐

