Я пытаюсь использовать NetworkX для чтения шейп-файла и использования функции write_shp()
для генерации шейп-файлов, которые будут содержать узлы и ребра, но при попытке запустить код выдает следующую ошибку:
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 и установил NetworkX через pip install.
До этой ошибки он уже дали мне еще один , который сказал «xrange не существует» или что - то подобное, так что я посмотрел его и просто поменял xrange
на range
в nx_shp.py файл, который , казалось, решить эту проблему.
Из того, что я прочитал, это может быть связано с версией Python (Python2 против Python3).
python
python-3.x
dictionary
friveraa
источник
источник
dict.iteritems -> dict.items
.iteritems
вitems
. Первый дал вам итератор (а в 3.x такого метода нет); последний дает вам представление (которое было перенесено в 2.7 какviewitems
).Ответы:
Поскольку вы находитесь в python3, используйте
dict.items()
вместоdict.iteritems()
iteritems()
был удален в python3, поэтому вы больше не можете использовать этот метод.Взгляните на раздел Python 3.0 Wiki Built-in Changes , где написано:
источник
iteritems
функции модулейfuture.utils
илиsix
.В Python2 у нас были
.items()
и.iteritems()
в словарях.dict.items()
возвращен список кортежей в словаре[(k1,v1),(k2,v2),...]
. Он скопировал все кортежи в словарь и создал новый список. Если словарь очень большой, это очень сильно влияет на память.Поэтому они созданы
dict.iteritems()
в более поздних версиях Python2. Это возвращенный объект итератора. Весь словарь не был скопирован, поэтому потребление памяти меньше. Людей, которые используютPython2
, учат использоватьdict.iteritems()
вместо.items()
эффективности, как объяснено в следующем коде.Вывод:
В Python3 , они хотели , чтобы сделать его более эффективным, так переехал
dictionary.iteritems()
вdict.items()
и удалены ,.iteritems()
так как не было больше не нужно.Вы использовали
dict.iteritems()
вPython3
так это не удалось. Попытка , используяdict.items()
который имеет такую же функциональность какdict.iteritems()
оPython2
. Это незначительная проблема миграции изPython2
вPython3
.источник
У меня была похожая проблема (с использованием 3.5), и я терял на нее 1/2 дня, но вот кое-что, что работает: я на пенсии и просто изучаю Python, чтобы помочь внуку (12).
источник
В Python2,
dictionary.iteritems()
более эффективен, чемdictionary.items()
в Python3, функциональностьdictionary.iteritems()
была перенесенаdictionary.items()
иiteritems()
удалена. Итак, вы получаете эту ошибку.Используйте
dict.items()
в Python3, который аналогиченdict.iteritems()
Python2.источник
Цель
.iteritems()
состояла в том, чтобы использовать меньше места в памяти, получая один результат за раз во время цикла. Я не уверен, почему версия Python 3 не поддерживает,iteritems()
хотя она доказала свою эффективность, чем.items()
Если вы хотите включить код, который поддерживает PY версии 2 и 3,
Это может помочь, если вы развернете свой проект в какой-либо другой системе, и вы не уверены в версии PY.
источник
Как отвечает RafaelC, Python 3 переименован в dict.iteritems -> dict.items. Попробуйте другую версию пакета. Это перечислит доступные пакеты:
Затем повторно запустите версию, которую вы попытаетесь после == установить / переключить версию
источник