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

试图将数据插入数据库,但出现以下错误:KeyError:“identifier”(Python)

  •  0
  • Niknak  · 技术社区  · 7 年前

    我想要完成的是从API端点获取数据并将其存储为CSV。然后将CSV文件导入SQLite数据库。我可以从API中很好地提取数据并输出到CSV文件中。但将CSV文件中的数据存储到SQLite中是一个问题。我一直收到以下错误:

    Traceback (most recent call last):
       File "info.py", line 46, in <module>
         i['col1'], i['col2'], i['col3'], 
         i['col4'], i['col5']) for i in dr]
       File "info.py", line 46, in <listcomp>
         i['col1'], i['col2'], i['col3'], 
         i['col4'], i['col5']) for i in dr]
    KeyError: 'col1'
    

    我想知道为什么会出现这个错误?

    如果有任何其他解决方案,我很乐意并愿意寻求帮助。目标是将CSV文件中的数据存储到SQLite数据库中。

    以下是我目前掌握的情况:

    import requests
    import csv
    import sqlite3
    
    
    con = sqlite3.connect("business.db")
    cur = con.cursor()
    
    cur.execute('DROP TABLE IF EXISTS firms')
    
    cur.execute(
     "CREATE TABLE firms (col1 PRIMARY KEY, col2 TEXT, col3 TEXT, "
     "col4 TEXT, col5 TEXT,...);"
     )
    
    r = requests.get('http://url/url/url')
    
    outfile = open(r"C:\Users\...\test.csv", "w")
    outfile.write(r.text)
    
    
    with open(r'C:\Users\...\...\test.csv', 'r') as fin: 
    dr = csv.DictReader(fin) 
    to_db = [(i['col1'], i['col2'], i['col3'], i['col4'], i['col5'], ...) for i in dr]
    
    
    cur.executemany("INSERT INTO firms (col1, col2, col3, col4, col5,  "...) VALUES (?, ?, ?, ?, ?, "
                    "...);", to_db)
    con.commit()
    con.close()
    

    此命令的输出( print(next(dr)) ):

    OrderedDict([('col1;"col2";"col3";"col4";"col5";"..."', 'value1;"value2";                                                     
    "value3";"value4";"value5";"..."')])
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   e.s.    7 年前

    csv文件中的分隔符为 ';' 而不是默认值 ',' 。因此它将整行作为一个条目读取,因为它试图在不存在的逗号处拆分它。

    使用 dr = csv.DictReader(fin, delimiter=';')