从pickle加载NetworkX图后报错'Graph'对象无'_node'属性如何解决
报错原因
这个报错确实是NetworkX版本不兼容导致的。
你用来序列化生成major_us_cities pickle文件的NetworkX为1.x版本,而当前运行环境安装的是2.x及以上版本的NetworkX。两个大版本的Graph对象内部存储结构存在不兼容变更:1.x版本用node属性存储节点数据,nodes是可调用方法;2.x版本重构后改用_node属性存储节点数据,nodes也调整为视图对象,因此旧版本序列化的图对象在新版本读取后会缺少_node属性,触发AttributeError。
解决方案
- 方案1:降级NetworkX版本到匹配版本
直接将当前环境的NetworkX降级到和生成pickle时一致的1.x版本即可,常用的兼容版本为1.11:
降级完成后原有代码可直接正常运行。pip install networkx==1.11 - 方案2:转换为跨版本兼容的图格式
如果需要继续使用2.x+版本的NetworkX,可以先临时搭建1.x版本环境读取pickle文件,导出为跨版本兼容的GraphML格式,再到高版本环境导入:
1.x环境导出代码:
2.x+环境导入代码:import networkx as nx G = nx.read_gpickle('major_us_cities') nx.write_graphml(G, 'major_us_cities.graphml')import networkx as nx G = nx.read_graphml('major_us_cities.graphml') # 可正常调用nodes方法 G.nodes(data=True) - 方案3:临时属性补全(仅应急使用)
不想切换版本也不想转格式的话,可以手动给读取到的旧版Graph对象补全新版本需要的属性:import networkx as nx G = nx.read_gpickle('major_us_cities') # 把旧版的node属性赋值给新版需要的_node属性 G._node = G.node G.nodes(data=True)
内容的提问来源于stack exchange,提问作者nerd_gram
相关产品推荐
相关产品推荐

