如何在 Python 中将 sqlite 导出为 CSV 而不格式化为列表?

Posted

技术标签:

【中文标题】如何在 Python 中将 sqlite 导出为 CSV 而不格式化为列表?【英文标题】:How to export sqlite to CSV in Python without being formatted as a list? 【发布时间】:2012-05-18 08:47:21 【问题描述】:

这是我目前拥有的:

conn = sqlite3.connect(dbfile)
conn.text_factory = str ## my current (failed) attempt to resolve this
cur = conn.cursor()
data = cur.execute("SELECT * FROM mytable")

f = open('output.csv', 'w')
print >> f, "Column1, Column2, Column3, Etc."
for row in data:
  print >> f, row
f.close()

它会创建一个 CSV 文件,其输出如下所示:

Column1, Column2, Column3, Etc.
(1, u'2011-05-05 23:42:29',298776684,1448052234,463564768,-1130996322, None, u'2011-05-06 04:44:41')

我不希望行在括号中,也不希望在字符串之前有引号或“u”。在没有所有这些的情况下,如何让它将行写入 csv?谢谢,

【问题讨论】:

【参考方案1】:

你目前正在做的是打印出一个元组的python字符串表示,即str(row)的返回值。这包括引号和'u'和括号等等。

相反,您希望为 CSV 文件正确格式化数据。好吧,试试csv module。它知道如何格式化 CSV 文件,这不足为奇。

with open('output.csv', 'wb') as f:
    writer = csv.writer(f)
    writer.writerow(['Column 1', 'Column 2', ...])
    writer.writerows(data)

【讨论】:

@Dougal 什么是“第 1 列”。这些是数据库列还是 csv 列。谢谢。 @AdamAzam 这只是作为第一行(标题)打印到 CSV 文件中。这个 sn-p 没有说明数据库,只是假设它按照您想要的顺序收集在变量 data 中。【参考方案2】:

我的版本只需几行就可以正常工作。

import pandas as pd

conn = sqlite3.connect(db_file, isolation_level=None,
                       detect_types=sqlite3.PARSE_COLNAMES)
db_df = pd.read_sql_query("SELECT * FROM error_log", conn)
db_df.to_csv('database.csv', index=False)

如果您想要一个表格分隔的文件,请将 .csv 扩展名更改为 .tsv 并添加此 sep='\t'

【讨论】:

这是最好的答案。对于现代版的 Pandas,最好使用read_sql,这样就不用担心lower level details。请参阅here 了解更多信息。 @Powers 没关系,除非您有这么多数据需要将其流式传输到 csv。 如果表太大,可能会导致系统因内存不足而死机。【参考方案3】:

将sqlite数据库表转换为csv文件也可以直接使用sqlite3工具完成:

>sqlite3 c:/sqlite/chinook.db
sqlite> .headers on
sqlite> .mode csv
sqlite> .output data.csv
sqlite> SELECT customerid,
   ...>        firstname,
   ...>        lastname,
   ...>        company
   ...>   FROM customers;
sqlite> .quit

上面的 sqlite3 命令将在你的当前目录中创建一个名为 data.csv 的 csv 文件(当然这个文件可以任意命名)。更多详情请点击此处:http://www.sqlitetutorial.net/sqlite-export-csv/

【讨论】:

这对我来说是最好的答案;谢谢,对我帮助很大!【参考方案4】:

如果只存在一张表,我使用了一个愚蠢但更简单的方法!

首先我将数据库转换为 Pandas DataFrame

conn = sqlite3.connect(database file)
df = pd.read_sql_query("select * from TABLE", conn)

然后将df转成CSV文件

df.to_csv(r'...\test_file.csv')

因此,正在以 test_file.CSV 的名称创建一个 CSV 文件

【讨论】:

以上是关于如何在 Python 中将 sqlite 导出为 CSV 而不格式化为列表?的主要内容,如果未能解决你的问题,请参考以下文章

在android中将房间数据库导出到csv文件

如何在QTableView Qt C ++中将sqlite db数据显示为多列视图?

如何在android中将arraylist或vector插入SQLite数据库?

在 Python 中将 Null 插入 SQLite3

在python sqlite中将结果行映射到namedtuple

如何在 Sqlite 中将两列合二为一,同时获取外键的底层值?