Question

I'm pretty new to coding, and am still exploring the endless joys of using Python. Please ask for any more info if you need it.

G is a networkx graph, such that:

G = nx.Graph(nx.read_dot('C:\Users\...\myCode.dot'))

The rest of my code rearranges the order the atoms/nodes in my networkx graph.I want to convert the output i get from my graph, G, into an xyz file so I can view it with an appropriate software package . But i'm left with the error message.

write(str(node['species'])+' '+str(node['x'])+' '+str(node['y'])+' '+str(node['z'])+'\n')
TypeError: string indices must be integers, not str

Here's the code below.

def writeGraphToXYZ(myGraph,myFilename):

""" Writes myGraph to myFilename as a .xyz file to allow easier visualisation of the                              graph.
.xyz files always start with the number of atoms on the first line,
followed by a comment string on the next line,
and then atom information on all successive lines.
"""
f = open(myFilename,'w') 
f.write(str(len(G))+'\n') # prints number of atoms followed by newline ('\n')
f.write('Atoms. File created from networkx graph by IsingModel.py\n')
for node in G:
    f.write(str(node['species'])+' '+str(node['x'])+' '+str(node['y'])+' '+str(node['z'])+'\n')
f.close()

Can someone show me how i can fix this?

Was it helpful?

Solution

You are getting that exception because node is a string, but you are trying to access elements in the node object as if it were a dictionary. To check the type of an object in Python, you can pass an object to the built in type() function

>>> from networkx import nx
>>> G = nx.Graph()
>>> G.add_node("span")
>>> for node in G:
        print node
        print type(node)
"span"
<type 'str'>

So you don't want to iterate over G, instead you probably want to access nodes via their key from the graph object directly.

>>> G['spam']
{}

To explain why you got this particular exception - in Python you can access each character in a string via its index. For example

>>> node = "hello"
>>> node[0]
"h"
>>> node[4]
"o"

If you pass any other object, for example a string, you'll get a TypeError.

>>> node["x"]
TypeError: string indices must be integers, not str
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top