Jupyter导入自定义JSON转CSV模块找不到json_to_dataframe属性如何解决
报错根因
- 方法归属错误:
json_to_dataframe是定义在JsonCsvConverter类内部的方法,不属于JsonTransformer模块的顶层属性,直接调用JsonTransformer.json_to_dataframe无法命中 - 代码存在语法错误:你提供的原始代码存在缩进错误、无效代码片段、类方法调用逻辑缺失的问题
- Jupyter模块缓存问题:Jupyter默认不会自动重载修改后的本地模块,导入的还是旧版本的模块内容
解决步骤
1. 修正JsonTransformer.py代码
替换原文件内容为修正后的版本,补全缺失逻辑、添加静态方法装饰器、暴露方法到模块顶层:
import pandas as pd import json from copy import deepcopy class JsonCsvConverter: @staticmethod def cross_join(left, right): new_rows = [] if right else left for left_row in left: for right_row in right: temp_row = deepcopy(left_row) for key, value in right_row.items(): temp_row[key] = value new_rows.append(temp_row) return new_rows @staticmethod def flatten_list(data): for elem in data: if isinstance(elem, list): yield from JsonCsvConverter.flatten_list(elem) else: yield elem @staticmethod def json_to_dataframe(data_in): def flatten_json(data, prev_heading=''): if isinstance(data, dict): rows = [{}] for key, value in data.items(): rows = JsonCsvConverter.cross_join(rows, flatten_json(value, prev_heading + '.' + key)) elif isinstance(data, list): rows = [] for i in range(len(data)): [rows.append(elem) for elem in JsonCsvConverter.flatten_list(flatten_json(data[i], prev_heading))] else: rows = [{prev_heading[1:]: data}] return rows return pd.DataFrame(flatten_json(data_in)) # 将方法暴露到模块顶层,支持直接通过模块调用 json_to_dataframe = JsonCsvConverter.json_to_dataframe if __name__ == '__main__': with open('cnntv_json') as json_file: json_data = json.load(json_file) df = json_to_dataframe(json_data) df.to_csv('cnntv.csv', mode='w')
2. 正确导入调用
在新的Jupyter Notebook中使用以下两种方式任意一种调用即可:
- 直接调用模块暴露的顶层方法:
import JsonTransformer df = JsonTransformer.json_to_dataframe(json_data)
- 导入类后调用类静态方法:
from JsonTransformer import JsonCsvConverter df = JsonCsvConverter.json_to_dataframe(json_data)
3. 解决模块缓存问题
如果修改代码后仍然报错,执行以下命令重载模块即可刷新缓存:
import importlib import JsonTransformer importlib.reload(JsonTransformer)
内容的提问来源于stack exchange,提问作者Ömer Fedai
相关产品推荐
相关产品推荐

