如何在for循环外部使用循环生成的DataFrame进行文件对比?
解决GCS存储桶文件名与Excel列表对比缺失值的问题
原代码的核心问题
你当前的循环里每次都会创建新的pd.DataFrame覆盖blob_list,导致循环结束后blob_list仅保留最后一个遍历到的文件名,无法实现批量对比。
修正步骤与完整代码
1. 正确收集GCS存储桶中的所有文件名
先初始化空列表存储所有文件名,遍历桶内文件时将文件名追加到列表,最后统一转为DataFrame:
# 初始化空列表存储所有GCS文件名 blob_names = [] for folderName in bucketFolder: blob_path = storage_client.list_blobs(bucketName, prefix=folderName) for blob in blob_path: # 提取文件名(去掉路径部分) filename = str(blob.name).rsplit("/", 1)[-1] blob_names.append(filename) # 转换为DataFrame,指定列名方便后续对比 blob_list = pd.DataFrame(blob_names, columns=['Blob_Filename'])
2. 读取Excel中的文件名列表
这部分代码可以保留,建议统一列名风格:
spreadsheet_filenames = pd.read_excel(spreadsheetFile, usecols=['Filename']) # 可选:统一列名,避免后续混淆 spreadsheet_filenames = spreadsheet_filenames.rename(columns={'Filename': 'Excel_Filename'})
3. 对比两者的缺失值
找出GCS中有但Excel中没有的文件
# 标记GCS文件是否在Excel中存在 blob_list['Exists_in_Excel'] = blob_list['Blob_Filename'].isin(spreadsheet_filenames['Excel_Filename']) # 提取缺失的文件 gcs_missing_in_excel = blob_list[~blob_list['Exists_in_Excel']]
找出Excel中有但GCS中没有的文件
# 标记Excel文件是否在GCS中存在 spreadsheet_filenames['Exists_in_GCS'] = spreadsheet_filenames['Excel_Filename'].isin(blob_list['Blob_Filename']) # 提取缺失的文件 excel_missing_in_gcs = spreadsheet_filenames[~spreadsheet_filenames['Exists_in_GCS']]
(可选)模糊匹配场景
如果需要判断GCS文件名是否包含在Excel文件名中(而非完全匹配),可以保留你原有的逻辑并调整为批量处理:
# 标记GCS文件名是否在任意Excel文件名中出现 blob_list['Exists_in_Excel'] = blob_list['Blob_Filename'].apply( lambda s1: spreadsheet_filenames['Excel_Filename'].str.contains(s1).any() )
注意事项
- 若存在大小写、空格、文件后缀差异,建议先统一处理(比如转小写、去除首尾空格、统一后缀格式)
- 文件数量较多时,
isin比逐行apply的效率更高,优先使用前者做完全匹配
内容的提问来源于stack exchange,提问作者Pete
相关产品推荐
相关产品推荐

