代码之家  ›  专栏  ›  技术社区  ›  user3217115

geonames转储到sqlite python错误“dict_items”对象不支持索引

  •  0
  • user3217115  · 技术社区  · 9 年前

    从下面运行python代码时,我遇到了这个错误

    '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
    
    1 回复  |  直到 9 年前
        1
  •  1
  •   Martijn Pieters    9 年前

    在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不兼容之处。