Python:如何将pickle txt文件转换为networkx的gpickles?

时间:2016-04-09 11:44:38

标签: python pickle networkx file-conversion

在处理同一图表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 而不更改图表功能?这将使我无需重新运行我的模拟。

3 个答案:

答案 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"))取消文件。然后取消了成功。