2016-04-09 15 views
2

Nachdem er mit einer Reihe von verschiedenen Vorkommen des gleichen Graphen arbeiten G, ich ließ sie als txt Dateien mit pickle diese Zeile mit:Python: Wie man eingelegte TXT-Dateien in gpickles für networkx konvertiert?

pickling=pickle.dump(G,open('pickled_G.txt','w')) #Example for one single graph 

nun zum Zwecke der weiteren Berechnungen, ich diese Diagramme zu ladende zurück in NetworkX by doing:

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 

EDIT ich diesen Fehler: ImportError: No module named copy_reg, die an der Linie zeigt, wo F=nx.read_gpickle(filename) .

Ich nehme an, das Problem ist, dass ich eine Reihe von txt Dateien habe und ich versuche, sie zu laden, als ob sie gpickle wären. Wenn meine Aufnahme korrekt ist, wie kann ich meine .txt Dateien in .gpicklekonvertieren, ohne die Grafikfunktionen zu ändern?? Dies würde es mir ersparen, meine Simulationen erneut auszuführen.

+1

Versuchen Sie, vollständige/absolute Pfade zu den Dateien zu verwenden. Vergewissern Sie sich, dass "os.listdir (work_dir)" tatsächlich * auf das richtige Verzeichnis zeigt. * "Ich nehme an, das Problem ist, dass ich eine Reihe von TXT-Dateien habe und versuche, sie zu laden, als wären sie gappig." * <- Ich glaube nicht, dass das das Problem ist. – jDo

Antwort

1

ich herausgefunden, was der Fehler war.Die Dateien wurden als txt geschrieben mit 'w' mit 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 

ich versuchte, sie mit nx.read_gpickle() zu laden, die für .gpickle Dateien aufruft.

Was gelöst das Problem war das Entpacken der Dateien mit pickle.load(open(filename,"r")). Die Unpickling war dann erfolgreich.

1

Der IOError schlägt vor, dass die Datei, die Sie referenzieren, einfach nicht da ist, nicht dass sie falsch geladen wird. Können Sie überprüfen, ob Sie das Skript aus dem richtigen Ordner ausführen, die Textdateien an der richtigen Stelle haben?

Ich bin auch nicht vertraut mit os.path.basename, aber es kann die Art sein, dass Sie die Datei referenzieren, die Probleme verursacht?

+0

Ich habe 'basename' durch' os.path.abspath' ersetzt, aber ich habe das gleiche Problem. Die Sache ist: Die Dateien sind, wo sie sein sollen, und das 'work_dir', das ich zugewiesen habe, ist korrekt. Anyhoo, wenn der Fehler auftritt, verweist es auf ein Verzeichnis, das ich nie im Skript verwendet habe. Woher? – FaCoffee

+0

Dies liegt daran, dass 'filename' auf einen anderen Ordner verweist. Wie kommt es, wenn es mit 'file' verknüpft ist, das wiederum mit' work_dir' verknüpft ist, wobei letzteres doppelt geprüft wird? – FaCoffee

2

ersten Fehler des OP (Datei nicht gefunden)

Versuchen voll/absoluten Pfade zu den Dateien. Bestätigen Sie, dass os.listdir(work_dir) tatsächlich zeigt zeigen Sie auf das richtige Verzeichnis.

„Ich nehme an, das Problem ist, dass ich ein paar txt-Dateien haben und ich versuche, sie zu laden, als ob sie gpickle waren“ < - ich glaube nicht, dass dies das Problem ist. Der Fehler tritt vor dieser Phase auf.

Führen Sie dieses etwas Licht auf vergießen, was los ist:

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 

2. Fehler des OP (Import: Kein Modul mit dem Namen copy_reg)

Dies könnte durch die verursacht werden, wie die Gurke Dateien waren geschrieben. Prüfen Sie this question und sehen, ob mit ẁb (schreiben binär) löst es:

file = open("test.txt", 'wb') 
thing = {'a': 1, 'b':2} 
cPickle.dump(thing, file) 
file.close() 

Ich könnte mir vorstellen, dass die Verwendung rb (lesen binär) zum Lesen auch nicht schaden würde.

Wenn Sie Gurke Dateien auf Linux sind geladen, die auf Windows geschrieben wurden, können Sie einen anderen Trick in der anderen Frage erwähnt zu tun haben:

dos2unix originalPickle.file outputPickle.file 
+0

Ich denke, ich habe eine brutale Workaround gefunden. Da 'filename' auf einen falschen Ordner verweist, habe ich folgendes geschrieben:' filename = work_dir + '\\' + file'. Viele werden es nicht mögen, aber jetzt bekomme ich einen anderen Fehler in einem anderen Abschnitt :) – FaCoffee

+1

@ FC84 Was ist, wenn Sie stattdessen die 'Join' Methode des' os' Moduls verwenden? Z.B. 'file_path = os.path.join (Arbeitsverzeichnis, Datei)'? Sie können wahrscheinlich nur Schrägstriche verwenden, anstatt mehr Komplexität durch die Verwendung von - und Escaping - Backslashes zu erzeugen. – jDo

+0

Ich wusste, dass es etwas brutal gewesen sein musste ... – FaCoffee