繁体   English   中英

将CSV文件导入sqlite表

[英]importing csv file to sqlite tables

我正在尝试将csv文件导入到我的表中。 我按照此处找到的类似步骤进行操作但是出现错误:

test.csv

"a",1,1
"b",2,2
"c",3,3

错误:

Traceback (most recent call last):
  File "C:/Users/Sam/Desktop/big data/workspace/yelpdatabase.py", line 19, in <module>
    to_db = [(i['letter'], i['num1'], i['num2']) for i in dr]
  File "C:/Users/Sam/Desktop/big data/workspace/yelpdatabase.py", line 19, in <listcomp>
    to_db = [(i['letter'], i['num1'], i['num2']) for i in dr]
KeyError: 'letter'

码:

import csv
import sqlite3

#Create The Database
connection = sqlite3.connect('test.db')

#create cursor
cursor = connection.cursor()

#Create table
cursor.execute('DROP TABLE IF EXISTS testtable')
cursor.execute('CREATE TABLE testtable ( letter text, num1 int, num2, int)')

#Load the CSV file into CSV reader
path = r"C:\Users\Sam\Desktop\big data\workspace\test.csv"
with open(path,'r') as fin: # `with` statement available in 2.5+
    # csv.DictReader uses first line in file for column headings by default
    dr = csv.DictReader(fin)  # comma is default delimiter
    to_db = [(i['letter'], i['num1'], i['num2']) for i in dr]

cursor.executemany("INSERT INTO t (letter, num1, num2) VALUES (?, ?, ?);", to_db)

#commit changes, and close the connection
connection.commit()
connection.close()

编辑:我上传了test.csv文件

如果不查看CSV,就很难确定到底出了什么问题,但是“ KeyError”表示DictReader生成的字典没有名为“ letter”的键。

仔细检查CSV的第一行是否包含“字母”。 例如,如果我的CSV如下所示:

head1,head2,head3

1,2,3

然后,提取数据的正确行将是:

to_db = [(i["head1"], i["head2"], i["head3"]) for i in dr]

注意-密钥区分大小写,因此在上面的示例中,“ head1”有效,但“ Head1”将生成KeyError。

编辑:感谢您发布CSV。 问题似乎是您没有标题行,因此DictReader正在获取字段名称["a","1","1"] (您可以通过调用dr.fieldnames进行检查)。

要使代码正常工作而无需修改CSV,可以将DictReader行更改为:

csv.DictReader(fin, ["letter", "num1", "num2"])

这将手动将标题“ letter”,“ num1”和“ num2”分配给您的三列。 然后,您可以执行以下操作:

to_db = [(i["letter"], i["num1"], i["num2"]) for i in dr]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM