有一篇文章告诉我如何将csv文件中的数据写入sqlite数据库(link)。 有没有办法简单地将整个文件复制到数据库表,而不是加载数据,然后按照链接中的建议迭代将它们附加到表中的行。
要在sqlite中执行此操作,只需键入
即可heresqlite> create table test (id integer, datatype_id integer, level integer, meaning text);
sqlite> .separator ","
sqlite> .import no_yes.csv test
我是使用数据库和sqlite3的新手,但我认为做这样的事情可以起作用
import sqlite3
conn = sqlite3.connect('mydatabase.db')
c = conn.cursor()
def create_table(name):
c.execute("CREATE TABLE IF NOT EXISTS {} (time REAL, event INTEGER, id INTEGER, size INTERGER, direction INTEGER)".format(name))
def copy_data(file2copy,table_name):
c.executescript("""
.separator ","
.import {} {}""".format(file2copy,table_name))
conn.commit()
try:
create_table('abc')
copy_data(r'Y:\MYPATH\somedata.csv','abc')
except Exception as e:
print e
c.close()
conn.close()
但显然它没有。我收到了错误
near ".": syntax error
编辑:由于以下建议使用子流程模块,我提出了以下解决方案。
import subprocess
sqlshell = r'c:\sqlite-tools\sqlite3' # sqlite3.exe is a shell that can be obtained from the sqlite website
process = subprocess.Popen([sqlshell], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
cmd = """.open {db}
.seperator ","
.import {csv} {tb}""".format(db='C:/Path/to/database.db', csv='C:/Path/to/file.csv', tb='table_name')
stdout, stderr = process.communicate(input=cmd)
if len(stderr):
print 'something went wrong'
重要的是,您应该在目录名中使用'/'而不是'\'。此外,您必须小心目录名称中的空格。
答案 0 :(得分:0)
您在copy_data
中使用的以.
开头的命令不属于sqlite3
,而是它附带的交互式shell。您无法通过sqlite3
模块使用它们。
您需要手动编写插入步骤或使用subprocess
模块运行shell程序。