Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中使用SQLite将.csv文件导入SQL数据库_Python_Sqlite_Csv - Fatal编程技术网

在Python中使用SQLite将.csv文件导入SQL数据库

在Python中使用SQLite将.csv文件导入SQL数据库,python,sqlite,csv,Python,Sqlite,Csv,我有2个.txt文件,我使用将它们转换为.csv文件。现在,我想使用Python中的SQLite将这两个.csv文件导入两个数据库(UI是Jupyter Notebook)。这两个.csv文件的标签分别为person.csv和person\u voces.csv。所以,我按照这里给出的代码()来做: 我不明白为什么当我尝试执行上面的代码时,我总是收到错误消息:“KeyError:'personid'”。有人能帮忙吗 另外,如果我在同一个Python文件中为文件person\u vots.csv创

我有2个.txt文件,我使用将它们转换为.csv文件。现在,我想使用Python中的SQLite将这两个.csv文件导入两个数据库(UI是Jupyter Notebook)。这两个.csv文件的标签分别为person.csvperson\u voces.csv。所以,我按照这里给出的代码()来做:

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

另外,如果我在同一个Python文件中为文件person\u vots.csv创建另一个名为to_db2的数据库表,下面的查询是否会给出两个表之间的所有common元素:

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

指向上面两个.csv文件的链接位于此处:

您的
INSERT-to…
语句中可能缺少一些列名


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

这对我在Windows 10上很有效,但在Linux/Unix下也应该有效。有几个问题:

  • person.csv的最后两行格式不正确,但这并不妨碍程序工作。您可以使用文本编辑器修复此问题
  • person.csv使用制表符作为分隔符,而不是逗号
  • 以“to_db=”开头的行中有一个拼写错误
  • 要导入的列数不匹配(2而不是11)
  • ExecuteMy上的表名错误
  • 此外,我在文件中而不是在内存中创建数据库。它足够小,性能不应该成为问题,而且您所做的任何更改都将被保存

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


    我尝试了他们的指令,但在他们的第一行代码(
    csvsql-I sqlite3 person.csv
    )中失败了。语法错误:sqlite3的语法无效(what???@cricket_007:您能告诉我为什么会出现这个错误吗?我已经导入了csvkit,并在Anaconda中将csvkit安装到我的环境中;请再检查一下那一页。说
    sqlite
    感谢您的回复。我的Python版本是3.0+,因此它没有sqlite。它只有sqlite3,但我相信它们没有太大的不同。谢谢您的评论。我确实指定了主键=personID。你错过了吗?除此之外,我得到的错误来自这一行:
    to_db=[(I['personid',I['age',],I['sex',],I['primary_voting_address_id',I['state_code',],I['state_flips',],I['country_fips',I['city',I['zipcode',I['zip4']),因为我在dr中,
    ,所以我不确定插入代码的原因是什么。老实说,我在指定所有列名时仍然收到相同的错误消息。在我尝试将所有列名添加到
    插入到…
    中之后,我从
    光标获得了一条新的错误消息。执行…
    语句:
    操作错误:table person已经存在。
    如果我将表名从
    person
    更改为
    person1
    ,我会在第11行得到原始错误消息:keyrerror:'personid'。不确定原因:(@Marichyasana:personID是唯一的,不是吗?你看了.csv文件了吗?@Marichyasana:你能通过修复我上面的代码尝试导入两个csv文件,并告诉我出了什么问题吗?我仍然不明白为什么会出现这个错误:(@ghjk我用wget下载了这两个文件,并用csvlint检查了第一个文件,用R检查了一点。给我一点时间,我会看看。非常感谢您的帮助,先生!如果我在执行您的代码时遇到任何问题,我会立即尝试并让您知道。到目前为止,我还没有看到您和我的代码之间的区别,除了pt行
    dr=csv.DictReader(person\u table,delimiter='\t')
    Btw,您知道
    DictReader()是否
    函数使用txt文件?显然,当我试图使用convertio.co网站将我的
    person.txt
    文件转换为
    .csv
    文件时,它只包含一部分数据。@ghjk这取决于txt文件的组织方式,你有指向它的链接吗?我有!!这是你需要的链接:。请告诉我你的位置对于txt文件,上述代码不起作用?如果是这种情况,如何修复它?基本上,txt文件必须在列中组织,列之间有一个选项卡。如果缺少一个值,则将有两个选项卡。两个txt文件都可以正常工作。例如,如果某个值具有嵌入的选项卡,则必须对其进行编辑以使用引号。一个非常简单的测试是用Excel打开txt文件。
    select ID from to_db, to_db2 WHERE to_db.ID ==  to_db2
    
    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()