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

33

这是我目前拥有的:

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文件而不包含这些内容?谢谢。
4个回答

32

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

相反,你想要将数据正确格式化为CSV文件。好吧,试试csv模块。它会惊讶地知道如何为CSV文件格式化事物。

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

newline='' 显然是为了正确转义引号内部的换行符而需要的。


@Dougal,“column 1”是什么意思?这是数据库列还是CSV列?谢谢。 - Barry Allen
@AdamAzam 这只是字面上作为 CSV 文件的第一行(标题)打印出来。这段代码片段并没有涉及到数据库,仅仅假设数据已经按你需要的顺序存储在一个名为“data”的变量中。 - Danica
writer.writerow(['Column 1', 'Column 2']) 给我报错:TypeError: a bytes-like object is required, not 'str'。但是当我使用 w 而不是 wb 打开文件时,就不会出现这种情况。我在代码中注释掉了 conn.text_factory = str,我不确定它是否与我得到的错误有关。 - John Smith
1
是的,抱歉 @JohnSmith,也许在过去的11年里发生了变化,或者当时我说错了 - 根据当前的文档,它应该以文本模式打开,而不是二进制模式。 - Danica
1
是的,抱歉@JohnSmith,也许在过去的11年中发生了变化,或者当时我错了 - 根据当前的文档,它应该在文本模式下打开,而不是二进制模式。 - Danica

21
我的版本只需几行代码就能正常运行而没有问题。
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'


3
这是最好的答案。对于现代版本的Pandas,最好使用read_sql,这样您就不必担心较低级别的细节。更多信息请参见此处 - Powers
@Powers 在数据量很大需要将其流式传输到 CSV 文件之前,这样做是可以的。 - t3chb0t
如果表太大,这可能会导致系统由于内存不足而挂起。 - Hoo

12

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

>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/

1
这是对我来说最好的答案;谢谢,它帮了我很多! - GlauberMD

0

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

首先,我将数据库转换为 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文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接