python将单个.db文件作为数据帧读取
我正在编写一个工作流,它首先将平面csv转换为.db文件以进行下游处理。该文件似乎写得很好,但当我再次尝试读取它时,它会抛出错误,表示该表不存在。这是我的密码:python将单个.db文件作为数据帧读取,python,sql,sqlite,Python,Sql,Sqlite,我正在编写一个工作流,它首先将平面csv转换为.db文件以进行下游处理。该文件似乎写得很好,但当我再次尝试读取它时,它会抛出错误,表示该表不存在。这是我的密码: import pandas as pd import sqlite3 # simulate some data df=pd.DataFrame({'DATE':['01-01-2000','01-02-2000','01-03-2000','01-04-2000','01-05-2000'],
import pandas as pd
import sqlite3
# simulate some data
df=pd.DataFrame({'DATE':['01-01-2000','01-02-2000','01-03-2000','01-04-2000','01-05-2000'],
'A1':[1,1,1,1,1],
'A2':[1,2,3,4,5],
'B':[2,2,3,3,2]})
df.to_csv('my_test.csv', index=False)
# function to write csv to .db file
def pandas_csv_to_db_converter(csvfile, table_name):
df = pd.read_csv(csvfile)
conn = sqlite3.connect(table_name)
df.to_sql(table_name, conn, if_exists='append', index=False)
return
pandas_csv_to_db_converter('my_test.csv', 'my_test.db')
到目前为止还不错,我有一个类似大小的csv和.db文件。所以我想看看表格,确保一切正常
def pandas_db_reader(db_file):
conn = sqlite3.connect(db_file)
c = conn.cursor()
c.execute("SELECT name FROM sqlite_master WHERE type='table';")
names = [tup[0] for tup in c.fetchall()]
print(names)
table = pd.read_sql_query("SELECT * from {}".format(db_file), conn)
print(table)
conn.close()
return
out_db = 'my_test.db'
pandas_db_reader(out_db)
字符串“my_test.db”在控制台的列表中打印为一个表,表示它是一个合法的表,但随后代码抛出一个错误:
cur.execute(*args)
sqlite3.OperationalError: no such table: my_test.db
During handling of the above exception, another exception occurred:
cur.execute(*args)
pandas.io.sql.DatabaseError: Execution failed on sql 'SELECT * from my_test.db': no such table: my_test.db
发生这种错误的原因不是很直观。我已经看过很多教程和堆栈溢出问题,关于如何做这一点,它似乎没有运行。我没有太多使用sql的经验,所以任何帮助都会非常有用!提前谢谢
编辑:输入错误编辑:
pandas_csv_to_db_converter('my_test.csv', my_test_db.db)
现在是
pandas_csv_to_db_converter('my_test.csv', 'my_test.db')
您正在将
db\u文件作为tablename传递到pandas\u db\u reader()
。您需要将正确的TABLE\u NAME
变量传递给下面的SQL查询
table = pd.read_sql_query("SELECT * from {}".format(TABLE_NAME), conn)
出于任何原因()my_test_db.db
不是有效的表名。将pandas\u csv\u中的表名值更改为\u db\u转换器
和pandas\u db\u读取器
,即
...
df.to_sql("test", conn, if_exists='append', index=False)
...
及
我怎样才能知道表名是什么?这基本上就是我所想的,这就是为什么我在“pandas_db_reader”中放了一些行来找出名字——我猜“名字”列表并没有给出我所想的东西!仅供参考,我已经尝试过:c.execute(“SELECT*FROM INFORMATION\u SCHEMA.TABLES”)和c.execute(“SELECT*FROM sys.TABLES”)您的表名在这里定义pandas\u csv\u to\u db\u converter('my\u test.csv',my\u test\u db.db)
。my\u test\u db
对象来自哪里?注意:my_test_db.db
未作为字符串传递。啊,很抱歉my_test_db.db是stackoverflow上的一个拼写错误,应该是“my_test.db”。我将编辑问题以保持一致性,它在我的程序中是正确的,但仍然无法运行。感谢您的帮助,此测试示例现在可以运行了。我想问题是从“pandas_csv_to_db_converter”开始的,我传递的是完整的文件名。如果我移动到工作目录并从那里运行整个工作流,只使用文件名而不使用完整路径,那么它就可以正常工作了看起来它使用了完整的文件路径作为表名,这就是我无法在“pandas\u db\u reader”中恢复表的原因,或者可能是保存到工作内存中,而不是保存到一个文件中,该文件在函数完成运行后被删除。无论如何,非常感谢!为什么不直接执行pandas.DataFrame.to_sql
?基本上,因为您已经拥有了DataFrame,您可以像这样将它推送到sqlite表中:engine=sqlalchemy.create_engine('sqlite:///my_db.sqlite“)df.to_sql('Resolved',engine,if_exists='append')
感谢您的帮助,csv来自其他地方,我只是为一个工作示例制作一些测试数据。
...
table = pd.read_sql_query("SELECT * from {}".format("test"), conn)
...