【问题标题】:Import .csv files into SQL database using SQLite in Python在 Python 中使用 SQLite 将 .csv 文件导入 SQL 数据库
【发布时间】:2017-09-03 22:47:27
【问题描述】:

我有 2 个 .txt 文件,我使用 https://convertio.co/csv-xlsx/ 将它们转换为 .csv 文件。现在,我想在 Python 中使用 SQLite 将这两个 .csv 文件导入两个数据库(UI 是 Jupyter Notebook)。这两个 .csv 文件被标记为 person.csvperson_votes.csv。所以,我按照这里给出的代码 (Importing a CSV file into a sqlite3 database table using Python) 做到了:

import sqlite3, csv

con = sqlite3.connect(":memory:")
cur = con.cursor()
cur.execute("CREATE TABLE person (personid STR,age STR,sex STR,primary_voting_address_id STR,state_code STR,state_fips STR,county_name STR,county_fips STR,city STR,zipcode STR, zip4 STR,  PRIMARY KEY(personid))") 

with open('person.csv','r') as person_table: # `with` statement available in 2.5+
    # csv.DictReader uses first line in file for column headings by default
    dr = csv.DictReader(person_table) # comma is default delimiter
#personid   age sex primary_voting_address_id   state_code  state_fips  county_name county_fips city    zipcode zip4
    to_db = [(i['personid'], i['age'], i['sex'], i['primary_voting_address_id'], i['state_code'], i['state_flips'], i['county_name'], i['county_fips'], i['city'], i['zipcode'], i['zip4']) for i in dr]

cur.executemany("INSERT INTO t (age, sex) VALUES (?, ?);", to_db)
con.commit()

我不明白为什么当我尝试执行上面的代码时,我不断收到错误消息:“KeyError: 'personid'”。有人可以帮忙吗?

另外,如果我在同一个 Python 文件中为文件 person_votes.csv 创建另一个名为 to_db2 的数据库表,以下查询是否会为我提供所有 两个表格之间的共同元素:

select ID from to_db, to_db2 WHERE to_db.ID ==  to_db2

上面两个 .csv 文件的链接在这里:https://drive.google.com/open?id=0B-cyvC6eCsyCQThUeEtGcWdBbXc

【问题讨论】:

  • 我尝试了他们的指令,但在他们的第一行代码上失败了 (csvsql -i sqlite3 person.csv) SyntaxError: invalid syntax at sqlite3 (what??)
  • @cricket_007:你能告诉我为什么会出现这个错误吗?我已经导入了 csvkit,并将 csvkit 安装到我在 Anaconda 的环境中;p
  • 再次检查该页面。说sqlite
  • 感谢您的回复。我的 Python 版本是 3.0+,所以它没有 sqlite。它只有 sqlite3,但我相信它们并没有太大的不同。

标签: python sqlite csv


【解决方案1】:

这适用于我在 Windows 10 上,但也应该在 Linux/Unix 下工作。有几个问题:

  1. person.csv 的最后两行格式不正确,但这并不妨碍程序正常工作。您可以使用文本编辑器修复此问题。
  2. person.csv 使用制表符而不是逗号作为分隔符。
  3. 以“to_db ="
  4. 开头的行中有错字(拼写)
  5. 要导入的列数不匹配(2 个而不是 11 个)
  6. executemany 上的表名错误。

此外,我在文件中而不是在内存中创建数据库。它足够小,性能不应该成为问题,并且您所做的任何更改都将被保存。

这是我更正的文件(你可以自己做另一张表):

import sqlite3, csv

# con = sqlite3.connect(":memory:")
con = sqlite3.connect("person.db")
cur = con.cursor()
cur.execute("CREATE TABLE person (personid STR,age STR,sex STR,primary_voting_address_id STR,state_code STR,state_fips STR,county_name STR,county_fips STR,city STR,zipcode STR, zip4 STR,  PRIMARY KEY(personid))") 

with open('person.csv','r') as person_table:
    dr = csv.DictReader(person_table, delimiter='\t') # comma is default delimiter
    to_db = [(i['personid'], i['age'], i['sex'], i['primary_voting_address_id'], i['state_code'], i['state_fips'], i['county_name'], i['county_fips'], i['city'], i['zipcode'], i['zip4']) for i in dr]

cur.executemany("INSERT INTO person VALUES (?,?,?,?,?,?,?,?,?,?,?);", to_db)
con.commit()

【讨论】:

  • 非常感谢您的帮助,先生!如果我在执行您的代码时遇到任何问题,我会尝试并立即通知您。到目前为止,我还没有看到你和我的区别,除了dr = csv.DictReader(person_table, delimiter='\t')这行
  • 顺便说一句,您知道DictReader() 函数是否适用于txt 文件?显然,当我尝试使用网站 convertio.co 将我的 person.txt 文件转换为 .csv 文件时,它只包含了一部分数据。
  • @ghjk 这取决于txt文件的组织方式,你有链接吗?
  • 我愿意!!这是您需要的链接:drive.google.com/open?id=0B-cyvC6eCsyCTXBUa1lOSHRVOFU。请让我知道对于txt文件,上面的代码在哪些情况下不起作用?如果是这种情况如何解决?
  • 基本上,txt 文件必须按列组织,列之间有一个选项卡。如果缺少一个值,您将有两个选项卡。您的两个 txt 文件都可以正常工作。例如,如果一个值有一个嵌入的选项卡,那么您必须对其进行编辑以使用引号。一个很简单的测试就是用Excel打开txt文件。
【解决方案2】:

您的INSERT INTO ... 语句中似乎缺少一些列名。

将主键也保留为NULL 可能不是很好的做法。

【讨论】:

  • 感谢您的评论。我确实指定了主键 = personID。你错过了吗?除此之外,我得到的错误来自这一行:to_db = [(i['personid'], i['age'], i['sex'], i['primary_voting_address_id'], i['state_code'], i['state_flips'], i['county_name'], i['county_fips'], i['city'], i['zipcode'], i['zip4']) for i in dr],所以我不确定INSERT INTO.... 行是否是原因。老实说,在指定所有列名时,我仍然收到相同的错误消息。
  • 在我尝试将所有列名添加到INSERT INTO... 之后,我从cursor.execute... 语句中收到一条新的错误消息:OperationalError: table person already exists. 如果我将表的名称从person 更改为person1,我在第 11 行得到了原始错误消息:KeyError:'personid'。不知道为什么:(
  • @Marichyasana:personID 是唯一的,不是吗?你看过 .csv 文件了吗??
  • @Marichyasana:您可以尝试通过修复我上面的代码来导入这两个 csv 文件,然后告诉我出了什么问题吗?我仍然不明白为什么会出现该错误:(
  • @ghjk 我使用 wget 下载了两个文件,并使用 csvlint 检查了第一个文件,并使用 R 进行了一点检查。给我一点时间,我会看到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
  • 2012-05-04
  • 1970-01-01
  • 2013-02-19
  • 1970-01-01
  • 2014-08-18
相关资源
最近更新 更多