pythonpython-3.xnumpynetworkxgml-geographic-markup-lan

Python-AttributeError: 'int' object has no attribute 'decode'" when trying to call the GML file on NetworkX


Premise・What I want to achieve

I'm going to use Python to read the GML file.

Error Message

Traceback (most recent call last):
  File "firstgml.py", line 9, in <module>
    G = nx.read_gml(gml_path)
  File "<decorator-gen-434>", line 2, in read_gml
  File "/Users/XXXX/.pyenv/versions/3.8.5/lib/python3.8/site-packages/networkx/utils/decorators.py", line 227, in _open_file
    result = func_to_be_decorated(*new_args, **kwargs)
  File "/Users/XXXX/.pyenv/versions/3.8.5/lib/python3.8/site-packages/networkx/readwrite/gml.py", line 218, in read_gml
    G = parse_gml_lines(filter_lines(path), label, destringizer)
  File "/Users/XXXX/.pyenv/versions/3.8.5/lib/python3.8/site-packages/networkx/readwrite/gml.py", line 398, in parse_gml_lines
    graph = parse_graph()
  File "/Users/XXXX/.pyenv/versions/3.8.5/lib/python3.8/site-packages/networkx/readwrite/gml.py", line 387, in parse_graph
    curr_token, dct = parse_kv(next(tokens))
  File "/Users/XXXX/.pyenv/versions/3.8.5/lib/python3.8/site-packages/networkx/readwrite/gml.py", line 315, in tokenize
    for line in lines:
  File "/Users/XXXX/.pyenv/versions/3.8.5/lib/python3.8/site-packages/networkx/readwrite/gml.py", line 209, in filter_lines
    line = line.decode('ascii')
AttributeError: 'int' object has no attribute 'decode'

Corresponding source code

import numpy as np
import networkx as nx

gml_path = "XXXX.gml"
gml_path = gml_path.encode("utf-8")
G = nx.read_gml(gml_path)
X = np.array(nx.to_numpy_matrix(G))
print(nx.is_directed(G))

What I tried

I changed the encoding character code to ascii and so on, but I get an error.

Supplementary information (FW / tool version, etc.)

Python 3.85

networkx 2.1

numpy 1.19.2


Solution

  • This is the part that is wrong.

    gml_path = "XXXX.gml"
    gml_path = gml_path.encode("utf-8")
    G = nx.read_gml(gml_path)
    

    You shouldn't be encoding the name of the file. read_gml takes a filename or a filehandle. When you pass the encoded gml_path it thinks it is an open file, so it goes to iterate over it. And when it goes to do line.decode('ascii'), the line variable contains b'X' which transfers to the number 88.

    gml_path = "XXXX.gml"
    gml_path = gml_path.encode("utf-8")
    print(gml_path[0])
    >>> 88
    

    The error you were getting before: "NetworkXError: input is not ASCII-encoded" is because your file is not properly encoded, not your path to file. What you should do is remove this line gml_path = gml_path.encode("utf-8"), and encode your GML file, either with another tool, or using Python.