python 安装gexf插件时遇到问题及需修改的内容
安装pygexf
pip install pygexf
import gexf 或 from gexf import Gexf (用来测试一下是否安装成功,如果你是python 3.0以上版本,那么看一下出现问题的解决办法。)
如果找不到自己python安装在什么地方了。。。可以用下面的方法查看。
import sys
print(sys.path)
问题1:No module named’_gexf’
打开python下site-packages 文件夹,找到gexf文件夹,对文件夹内的__init__.py进行修改,将所有的__gexf之前加’.’(加一个 “点” )
问题2:TabError: inconsistent use of tabs and spaces in indentation
空格和tab空格位置不统一问题,打开_gexf.py文件,重新将代码格式重排一下即可解决。
问题3:except Exception, e
由于是python 2.0版本的,与3.0版本在编写格式上的不同,所以报错,这里 打开_gexf.py文件 修改成 except Exception as e: 解决。
同理还有一些print的问题,给print把括号加上 print() 即可。
问题4 :ModuleNotFoundError: No module named ‘lxml’
pip install lxml 解决
问题5:AttributeError: ‘dict’ object has no attribute ‘iteritems’ 错误提示。
是由于python3.5以后,iteritems 变为 items。
所有都改为:
for id, value in self._nodesAttributes.items()
问题6:TypeError: write() argument must be str, not bytes
原因为:Python3给open函数添加了名为encoding的新参数,而这个新参数的默认值却是‘utf-8’。这样在文件句柄上进行read和write操作时,系统就要求开发者必须传入包含Unicode字符的实例,而不接受包含二进制数据的bytes实例。
解决方法:使用二进制写入模式(‘wb’)来开启待操作文件,而不能像原来那样,采用字符写入模式(‘w’)。
可能比较麻烦,下面直接给出改好的代码
# -*- coding: utf-8 -*-
from lxml import etree
from datetime import *
# missing features :
# load, validate, modify existing gexf file
# slices / phylogeny / ...
# evolution ideas :
# add display stats on graph composition when exportingto xml
# add anti-paralell edges test
# add a test based on existing example from gexf.net
# add modification accessors like setStart ...
# factorize attribute managment by creating an attribute class
# add a test code utility to check that code will not use _variable outside objects
class Gexf:
def __init__(self, creator, description):
self.creator = creator
self.description = description
self.graphs = []
self.xmlns = "http://www.gephi.org/gexf/1.1draft"
self.xsi = "http://www.w3.org/2001/XMLSchema-instance"
self.schemaLocation = "http://www.gephi.org/gexf/1.1draft http://gephi.org/gexf/1.1draft.xsd"
self.viz = "http://www.gexf.net/1.1draft/viz"
self.version = "1.1"
def addGraph(self, type, mode, label):
g = Graph(type, mode, label)
self.graphs.append(g)
return g
def getXML(self):
gexfXML = etree.Element("{" + self.xmlns + "}gexf", version=self.version,
nsmap={
None: self.xmlns, 'viz': self.viz, 'xsi': self.xsi})
# gexfXML.set("xmlnsxsi",)
gexfXML.set("{xsi}schemaLocation", self.schemaLocation)
meta = etree.SubElement(gexfXML, "meta")
meta.set("lastmodified", datetime.now().isoformat())
etree.SubElement(meta, "creator").text = self.creator
etree.SubElement(meta, "description").text = self.description
for graph in self.graphs:
gexfXML.append(graph.getXML())
return gexfXML
def write(self, file):
file.write(etree.tostring(self.getXML(), pretty_print=True, encoding='utf-8'))
self.print_stat()
def print_stat(self):
for graph in self.graphs:
graph.print_stat()
class Graph:
def __init__(self, type, mode, label, start="", end=""):
# control variable
self.authorizedType = ("directed", "undirected")
self.authorizedMode = ("dynamic", "static")
self.defaultType = "directed"
self.defaultMode = "static"
self.label = label
if type in self.authorizedType:
self.type = type
else:
self.type = self.defaultType
if mode in self.authorizedMode:
self.mode = mode
else:
self.mode = self.defaultMode
self.start = start
self.end = end
self._nodesAttributes = {
}
self._edgesAttributes = {
}
self._nodes = {
}
self._edges = {
}
def addNode(self, id, label, start="", end="", pid="", r="", g="", b=""):
self._nodes[id] = Node(self, id, label, start, end, pid, r, g, b)
return self._nodes[id]
def nodeExists(self, id):
if id in self._nodes.keys():
return 1
else:
return 0
def addEdge(self, id, source, target, weight="", start="", end="", label=""):
self._edges[id] = Edge(self, id, source, target, weight, start, end, label)
return self._edges[id]
def addNodeAttribute(self, title, defaultValue, type="integer", mode="static", force_id=""):
# add to NodeAttributes
# generate id
if force_id == "":
id = len(self._nodesAttributes)
else:
id = force_id
self._nodesAttributes[id] = {
"title": title, "default": defaultValue, "mode": mode,
"type": type} # modify Nodes with default
#: bad idea and unecessary
# for node in self._nodes.values():
# node.addAttribute(id,defaultValue)
return id
def addDefaultAttributesToNode(self, node):
# add existing nodesattributes default values
for id, values in self._nodesAttributes.iteritems():
node.addAttribute(id, values["default"])
def checkNodeAttribute