2015-10-01 63 views
6

Ho scaricato il file gml che contiene lo dolphins social network.Errore inatteso nella lettura del grafico GML

Qualche tempo fa ho fatto un po 'di analisi su quella rete che esegue python 3.4 e NetworkX 1.9 su aa macchina Windows7, ma ora sto facendo funzionare su una macchina Linux Arch (con la stessa versione di Python, ma con NetworkX 1.10) e ha riscontrato un problema durante il tentativo di leggere il file.

Questo è il codice utilizzato per leggere il file:

import networkx as nx 
nx.read_gml("dolphins.gml") 

e questa è l'analisi dello stack dell'errore:

Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
File "<string>", line 2, in read_gml 
File "/usr/lib/python3.4/site-packages/networkx/utils/decorators.py",line 220, in _open_file 
result = func(*new_args, **kwargs) 
File "/usr/lib/python3.4/site-packages/networkx/readwrite/gml.py", line 210, in read_gml 
G = parse_gml_lines(filter_lines(path), label, destringizer) 
File "/usr/lib/python3.4/site-packages/networkx/readwrite/gml.py", line 383, in parse_gml_lines 
graph = parse_graph() 
File "/usr/lib/python3.4/site-packages/networkx/readwrite/gml.py", line 372, in parse_graph 
curr_token, dct = parse_kv(next(tokens)) 
File "/usr/lib/python3.4/site-packages/networkx/readwrite/gml.py", line 323, in tokenize 
(line[pos:], lineno + 1, pos + 1)) 
networkx.exception.NetworkXError: cannot tokenize 'graph' at (1, 1) 

si è in grado di leggere il file? Qualcuno ha avuto un problema simile? o sa cosa sta generando l'errore?

Grazie in anticipo!

+0

Strano - ha funzionato per me (sì, ho anche usato la rete di delfini). Sto usando networkx 2.0.dev_20151001131915 in python 2.7. – Joel

+0

Si potrebbe essere in esecuzione la stessa cosa come qui: http://stackoverflow.com/questions/31946029/networkx-read-gml-error-networkx-exception-networkxerror-cannot-tokenize-ugra Ma nessuno ha dato un rispondi lì. – Joel

+0

Ecco il codice sorgente per 'read_gml' http://networkx.readthedocs.org/en/latest/_modules/networkx/readwrite/gml.html Sembra che il messaggio di errore non provochi una corrispondenza in alcune espressioni regolari. – Joel

risposta

2

Ha funzionato eseguendo il downgrade della versione networkx dalla 1.10 alla 1.9.1.

Spero che questa risposta possa aiutare qualcun altro.

+0

Sembra che i lettori/scrittori di gml in 1.9.1 fossero molto "flessibili" (non molti controlli eseguiti sugli attributi di nodo e spigolo - cercavano solo di leggerli nel modo migliore possibile e interpretare gli attributi come tipi appropriati di GML - liste, dicts o stringhe) Le versioni successive (1.10, 1.11) sembrano aver implementato un numero di verifiche che rendono difficile la lettura/scrittura di file meno recenti. Ad esempio, in 1.11, non è possibile assegnare chiavi di attributo nodo o spigolo con caratteri di sottolineatura! Un po 'fastidioso. Vedi qui: https://networkx.github.io/documentation/latest/_modules/networkx/readwrite/gml.html – dpb

5

Nelle versioni più recenti di networkx, il file gml deve seguire un formato più specifico. Il problema con i delfini.gml è che non dovrebbe esserci alcun ritorno a capo prima delle parentesi quadre aperte. Per esempio:

formato sbagliato:

graph 
[ 
    directed 0 
    node 
    [ 
    id 0 
    label "Beak" 
    ] 
    . 
    . 
    . 

formato corretto:

graph [ 
    directed 0 
    node [ 
    id 0 
    label "Beak" 
    ] 
    . 
    . 
    . 

Essa non si preoccupa di quanti spazi ci sono prima della parentesi quadra finché non v'è più di uno e non c'è ritorno a capo.

Quello che ho finito è stato usare espressioni regolari per liberare gli spazi bianchi prima delle parentesi quadre di apertura. Il seguente regex ha funzionato per me:

\s+\[ 

e basta sostituirlo con "[". Ci deve essere almeno uno spazio prima della parentesi.

Inoltre, tenere presente che ogni nodo deve avere un'etichetta univoca.

Spero che abbia aiutato.

+2

Nel caso qualcuno cerchi un comando sed: 'sed -i 'N; s/\ s \ + \ [/ \ [/ g; P; D 'delfini.gml' – surt91