我试图使用NetworkX读取一个Shapefile,并使用write_shp()函数来生成包含节点和边的Shapefile,但当我尝试运行代码时,它给了我以下错误:
Traceback (most recent call last): File
"C:/Users/Felipe/PycharmProjects/untitled/asdf.py", line 4, in
<module>
nx.write_shp(redVial, "shapefiles") File "C:\Python34\lib\site-packages\networkx\readwrite\nx_shp.py", line
192, in write_shp
for key, data in e[2].iteritems(): AttributeError: 'dict' object has no attribute 'iteritems'
我使用Python 3.4,并通过pip install安装NetworkX。
在这个错误之前,它已经给了我另一个错误,说“xrange不存在”或类似的东西,所以我查找它,只是在nx_sh .py文件中将xrange更改为range,这似乎解决了这个问题。
据我所知,它可能与Python版本(Python2 vs Python3)有关。
在Python2中,字典中有.items()和.iteritems()。Dict.items()返回字典[(k1,v1),(k2,v2),…]中的元组列表。它复制了字典中的所有元组,并创建了新的列表。如果字典很大,对内存有很大的影响。
因此,他们在Python2的后续版本中创建了dict.iteritems()。返回的迭代器对象。没有复制整个字典,因此内存消耗较少。使用Python2的人被教导使用dict.iteritems()而不是.items()以提高效率,如下代码所述。
import timeit
d = {i:i*2 for i in xrange(10000000)}
start = timeit.default_timer()
for key,value in d.items():
tmp = key + value #do something like print
t1 = timeit.default_timer() - start
start = timeit.default_timer()
for key,value in d.iteritems():
tmp = key + value
t2 = timeit.default_timer() - start
输出:
Time with d.items(): 9.04773592949
Time with d.iteritems(): 2.17707300186
在Python3中,他们想让它更高效,因此将dictionary.iteritems()移动到dict.items(),并删除了不再需要的.iteritems()。
你在Python3中使用了dict.iteritems(),所以它失败了。尝试使用dict.items(),它具有与Python2的dict.iteritems()相同的功能。这是从Python2到Python3的一个小迁移问题。
在Python2中,字典中有.items()和.iteritems()。Dict.items()返回字典[(k1,v1),(k2,v2),…]中的元组列表。它复制了字典中的所有元组,并创建了新的列表。如果字典很大,对内存有很大的影响。
因此,他们在Python2的后续版本中创建了dict.iteritems()。返回的迭代器对象。没有复制整个字典,因此内存消耗较少。使用Python2的人被教导使用dict.iteritems()而不是.items()以提高效率,如下代码所述。
import timeit
d = {i:i*2 for i in xrange(10000000)}
start = timeit.default_timer()
for key,value in d.items():
tmp = key + value #do something like print
t1 = timeit.default_timer() - start
start = timeit.default_timer()
for key,value in d.iteritems():
tmp = key + value
t2 = timeit.default_timer() - start
输出:
Time with d.items(): 9.04773592949
Time with d.iteritems(): 2.17707300186
在Python3中,他们想让它更高效,因此将dictionary.iteritems()移动到dict.items(),并删除了不再需要的.iteritems()。
你在Python3中使用了dict.iteritems(),所以它失败了。尝试使用dict.items(),它具有与Python2的dict.iteritems()相同的功能。这是从Python2到Python3的一个小迁移问题。