如何跳过空JSON文件处理Guardian API数据,避免Pandas读取异常?
解决Guardian API JSON空文件处理与数据导出问题
我来帮你搞定这个问题——空JSON文件导致的Pandas报错确实很头疼,咱们一步步调整代码来解决:
首先先修正你代码里的小bug:原makePathToFile函数里的路径拼接逻辑有问题,而且没过滤非JSON文件,容易读到无关内容。然后我们重点处理空文件的判断和有效数据的提取。
完整修改后的代码
import pandas as pd import os def makePathToFile(path): pathtoJson = [] # 遍历目录下所有文件,只保留JSON格式的 for root, _, filenames in os.walk(path): for filename in filenames: if filename.lower().endswith('.json'): # 用root拼接正确的文件路径,避免子目录文件路径错误 pathtoJson.append(os.path.join(root, filename)) return pathtoJson def readJsonAndWriteCSV(pathToJson, output_csv='guardian_articles.csv', desired_keys=['webTitle', 'webUrl', 'sectionName', 'publicationDate']): all_valid_data = [] for json_file in pathToJson: # 先判断文件是否为空数组(内容仅为[]) with open(json_file, 'r', encoding='utf-8') as f: content = f.read().strip() if content == '[]': print(f"跳过空文件: {json_file}") continue # 读取JSON并处理可能的异常 try: df = pd.read_json(json_file) # 检查所需字段是否都存在 missing_keys = [key for key in desired_keys if key not in df.columns] if missing_keys: print(f"跳过文件 {json_file}: 缺失字段 {missing_keys}") continue # 提取需要的列,加入总列表 all_valid_data.append(df[desired_keys]) except Exception as e: print(f"处理文件 {json_file} 出错: {str(e)}") continue # 合并所有有效数据并导出CSV if all_valid_data: final_df = pd.concat(all_valid_data, ignore_index=True) final_df.to_csv(output_csv, index=False, encoding='utf-8') print(f"成功导出 {len(final_df)} 条新闻到 {output_csv}") else: print("未找到有效新闻数据") # 调用示例(替换成你的JSON文件夹路径) json_file_paths = makePathToFile('/path/to/your/json/folder') readJsonAndWriteCSV(json_file_paths)
关键改进点说明
- 空文件判断:先读取文件内容直接判断是否为
[],比先读成DataFrame再判断更高效,还能避免空DataFrame访问字段的报错。 - 路径修复:用
os.walk返回的root拼接文件路径,确保子目录里的文件也能被正确找到;同时过滤只处理.json后缀的文件。 - 健壮性提升:加入
try-except捕获JSON格式错误等异常,避免单个坏文件导致整个脚本崩溃;还能检查所需字段是否存在,避免提取字段时出错。 - 批量处理:收集所有有效数据后再一次性导出CSV,比逐个追加写入更高效。
你可以根据自己的需求调整desired_keys列表,把需要的字段(比如webTitle、webUrl、publicationDate等)都加进去,最终导出的CSV就会包含这些列。
内容的提问来源于stack exchange,提问作者Gabriel Almeida
相关产品推荐
相关产品推荐

