命令行传入JSON转Pandas DataFrame异常:列名不符合预期问题排查
修复命令行JSON输入转Pandas DataFrame的异常问题
问题说明
执行命令python script.py --input [{\"A\":\"322|985\",\"B\":3}]传入JSON格式输入,期望生成与pd.DataFrame([{"A":"322|985","B":3}])一致的多列DataFrame,但当前代码仅生成名为0的单列,值为原始JSON字符串,不符合预期。
修复方案
- 直接对命令行传入的字符串进行JSON解析,无需先执行
json.dumps再json.loads,避免将输入字符串转义后无法正确解析为Python对象。 - 解析后的JSON数据本身就是包含字典的列表,直接传入
pd.DataFrame即可,无需额外包裹一层列表。 - 调整输入验证逻辑,针对字符串类型输入优先做JSON解析。
修复后完整代码
import json import pandas as pd import argparse def validate_input(input_data): if isinstance(input_data, pd.DataFrame): return input_data # 已是DataFrame,直接返回 # 直接解析输入的JSON字符串为Python对象 json_data = json.loads(input_data) # 解析后的数据本身是列表,直接传入DataFrame return pd.DataFrame(json_data) def process_data(input_data): """ 处理数据,仅在输入格式有效时调用 """ validated_data = validate_input(input_data) print(validated_data) print("Processing data:\n", validated_data) def main(): parser = argparse.ArgumentParser(description="验证并处理JSON或Pandas DataFrame输入。") parser.add_argument("--input", type=str, help="JSON字符串格式的输入数据") args = parser.parse_args() try: process_data(args.input) except json.JSONDecodeError: raise TypeError("无效的JSON输入,请提供合法的JSON字符串。") if __name__ == "__main__": main()
修复逻辑说明
原代码中,json.dumps(input_data)会把命令行传入的JSON字符串转成带转义的字符串(比如将[{"A":"322|985","B":3}]变成"[{\"A\":\"322|985\",\"B\":3}]"),再执行json.loads得到的还是原始的字符串,而非解析后的列表字典。此时用pd.DataFrame([json_data])会把整个字符串作为单列数据。
修复后直接对输入字符串做json.loads,得到包含字典的列表[{"A":"322|985","B":3}],这个结构正好符合pd.DataFrame的输入要求,传入后会生成包含A、B两列的DataFrame,与预期一致。
内容的提问来源于stack exchange,提问作者Lopez
相关产品推荐
相关产品推荐

