在python中从sqlite3数据库写入CSV

时间:2013-09-16 11:38:43

标签: python csv sqlite

好的,我有一个名为cars.db的数据库,它有一个表==库存,

库存主要包含

    ('Ford', 'Hiluz', 2),
    ('Ford', 'Tek', 6),
    ('Ford', 'Outlander', 9),
    ('Honda', 'Dualis', 3),
    ('Honday', 'Elantre', 4)

然后我写了这个是为了编辑csv,但是,我似乎无法解决这个问题,在某些情况下我得到的东西要打印但是它不对,当我尝试修复它时,没有打印。有什么建议让我走上正轨吗?

#write table to csv

import sqlite3
import csv

with sqlite3.connect("cars.db") as connection:
    csvWriter = csv.writer(open("output.csv", "w"))
    c = connection.cursor()

    rows = c.fetchall()

    for x in rows:
        csvWriter.writerows(x)

3 个答案:

答案 0 :(得分:8)

你应该这样做:

rows = c.fetchall()
csvWriter.writerows(rows)

如果您遍历行的原因是因为在将它们写入文件之前不想对它们进行预处理,那么请使用writerow方法:

rows = c.fetchall()
for row in rows:
    # do your stuff
    csvWriter.writerow(row)

答案 1 :(得分:1)

为了将标题排在第一行,cars.db中的表库存建议使用字典方法

import sqlite3
import csv
import os.path
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
db_path = os.path.join(BASE_DIR, "cars.db")
conn = sqlite3.connect(db_path)
c = conn.cursor()
c.execute("SELECT rowid, * FROM inventory")    
columns = [column[0] for column in c.description]
results = []
for row in c.fetchall():
    results.append(dict(zip(columns, row)))
with open("output.csv", "w", newline='') as new_file:
    fieldnames = columns
    writer = csv.DictWriter(new_file,fieldnames=fieldnames)
    writer.writeheader()
    for line in results:
        writer.writerow(line)
conn.close()

答案 2 :(得分:0)

使用熊猫应该性能更高,所需的代码更少。您可以将数据从sqlite表保存到Pandas DataFrame,然后使用Pandas编写CSV文件。

df = pd.read_sql('SELECT * from cars', conn)
df.to_csv('cars.csv')

以下是使用伪造数据创建sqlite表的完整代码:

import pandas as pd
import sqlite3

# create Pandas DataFrame
data = [('Toyota', 'Hilux', 2),
    ('Ford', 'Tek', 6),
    ('Ford', 'Outlander', 9),
    ('Honda', 'Dualis', 3),
    ('Honday', 'Elantre', 4)]
df = pd.DataFrame.from_records(data, columns=['make', 'model', 'age'])

# establish sqlite connection
conn = sqlite3.connect('../tmp/cars.db')
c = conn.cursor()

# create sqlite table
c.execute('''CREATE TABLE cars (make text, model text, age int)''')

# add data to sqlite table
df.to_sql('cars', conn, if_exists='append', index = False)

# write sqlite table out as a CSV file
df = pd.read_sql('SELECT * from cars', conn)
df.to_csv('../tmp/cars.csv')

以下代码可通过一个命令将sqlite数据库中的所有表写为CSV文件:

for table in c.execute("SELECT name FROM sqlite_master WHERE type='table';").fetchall():
    t = table[0]
    df = pd.read_sql('SELECT * from ' + t, conn)
    df.to_parquet('../tmp/' + t + '.csv')

有关更多信息,请参见here