2015-02-27 2 views
0

я получаю эту ошибку при выполнении кода питона из нижеGeoNames-дамп объекта SQLITE Python CHECK «dict_items» не поддерживает индексацию

'dict_items' object does not support indexing 

https://github.com/commodo/geonames-dump-to-sqlite/blob/master/geonames_dump_to_sqlite.py

что код делает это получить файлы от geonames и поместить результаты в базу данных sqlite.

он прекрасно работает до создания таблиц

def create_tables(cur): 
    ''' 
    Create empty tables which will be populated later. 
    ''' 
    for table_name in TABLE_MAPPINGS.values(): 
     cur.execute('DROP TABLE IF EXISTS %s' % table_name) 
     table_fields = [ "%s %s" % table_field.listitems()[0] for table_field in TABLE_FIELDS ] 
     cur.execute('CREATE TABLE %s (%s)' % (table_name, ','.join(table_fields))) 

специфических ошибок:

line 111, in <listcomp> 
    table_fields = [ "%s %s" % table_field.items()[0] for table_field in TABLE_FIELDS ] 
TypeError: 'dict_items' object does not support indexing 
+0

'table_field.items() [0]' - словарь слова 'dict.items()'. Как вы создали 'TABLE_FIELDS'? –

+0

Ваш код и трассировка не совпадают; вы вставили слово 'list'. –

ответ

1

В Python 3, dict.items() возвращает словарь вида, а не объект списка. Вы можете преобразовать его в список здесь (есть только один ключ и значение в TABLE_FIELDs записи в любом случае):

table_fields = [ "%s %s" % list(table_field.items())[0] for table_field in TABLE_FIELDS ] 

Позже, вы будете работать с той же проблемой, так как код пытается сделать то же самое table_field.keys():

table_fields = [ "%s" % list(table_field.keys()[0] for table_field in TABLE_FIELDS ] 

Изменить что:

table_fields = [ "%s" % list(table_field)[0] for table_field in TABLE_FIELDS ] 

Оба применения могут быть также заменены next(iter(table_field.items())) и next(iter(table_field)) соответственно ,

Я понятия не имею, почему автор использовал список однонаправленных словарей; это бы было проще, если код используется кортежи вместо:

TABLE_FIELDS = [('parentid',  'integer'), 
       ('geonameid',  'integer'), 
       ('name',   'text'), 
       # etc. 

затем использовать % table_field и % table_field[0] соответственно.

Однако в этом скрипте могут быть и другие несовместимости Python 3.

+0

thx для быстрого ответа. Теперь я получаю TabError: непоследовательное использование вкладок и пробелов в отступе ... sry никогда не работал с python. – user3217115

+0

@ user3217115: вы не можете смешивать вкладки и пробелы. Используйте пробелы для отступов * только *, если это вообще возможно. Запустите сценарий с 'python -tt scriptname.py', чтобы Python сообщил вам, где вы сломали отступ, смешав вкладки и пробелы. –

+0

THX ты лучший! – user3217115