在处理同一图表G
的多个不同事件后,我使用以下行将其txt
文件转储为pickle
:
pickling=pickle.dump(G,open('pickled_G.txt','w')) #Example for one single graph
现在,为了进一步计算,我想通过执行以下操作将这些图表加载到networkx中:
work_dir=raw_input('Working directory: ')
for i,file in enumerate(os.listdir(work_dir)):
if file.endswith(".txt"):
filename=os.path.abspath(file)
F = nx.read_gpickle(filename) #Loading graph G back into Python and calling it F
修改
我收到此错误:ImportError: No module named copy_reg
,它指向F=nx.read_gpickle(filename)
。
我认为问题在于我有一堆txt
个文件,而我正在尝试加载它们,就好像它们是gpickle
一样。如果我的观点是正确的,我如何将.txt
文件转换为.gpickle
而不更改图表功能?这将使我无需重新运行我的模拟。
答案 0 :(得分:2)
OP的第一个错误(找不到文件)
尝试使用文件的完整/绝对路径。确认os.listdir(work_dir)
实际 指向正确的目录。
"我认为问题在于我有一堆txt文件,我正在尝试加载它们,好像它们是gpickle" < - 我不会&#39不认为这是问题所在。错误发生在此阶段之前。
运行此功能以了解正在发生的事情:
import os
work_dir=raw_input('Working directory: ')
if os.path.isdir(work_dir):
print "Directory exists:", work_dir
for i,f in enumerate(os.listdir(work_dir)):
if os.path.exists(f):
if os.path.isfile(f):
print "Found a file named:", f
else:
print "Found something else (dir) named:", f
else:
print "Invalid path within a valid work_dir:", f
else:
print "Work_dir does not exist:", work_dir
OP的第二个错误(ImportError:没有名为copy_reg的模块)
这可能是由于pickle文件的编写方式造成的。检查this question并查看使用ẁb
(写二进制文件)是否解决了它:
file = open("test.txt", 'wb')
thing = {'a': 1, 'b':2}
cPickle.dump(thing, file)
file.close()
我认为使用rb
(读取二进制)进行阅读也不会造成伤害。
如果你在Linux上加载了在Windows上编写的pickle文件,你可能需要做另一个问题中提到的另一个技巧:
dos2unix originalPickle.file outputPickle.file
答案 1 :(得分:1)
IOError表明您所引用的文件不存在,而不是它被错误地加载。你能仔细检查一下你是从正确的文件夹运行你的脚本,把文本文件放在正确的位置等吗?
我也不熟悉os.path.basename,但它可能是你引用导致问题的文件的方式?
答案 2 :(得分:1)
我弄清楚错误是什么。这些文件使用txt
编译为'w'
pickle.dump()
:
pickling=pickle.dump(G,open(original_dir2+'\\pickling_test.txt','w'))
#G is the graph from networkx, and original_dir is the dir where the txt files were dumped
我尝试使用nx.read_gpickle()
加载它们,这会调用.gpickle
个文件。
解决问题的方法是使用pickle.load(open(filename,"r"))
取消文件。然后取消了成功。