【问题标题】:Write to CSV from sqlite3 database in python在 python 中从 sqlite3 数据库写入 CSV
【发布时间】:2013-09-20 13:04:11
【问题描述】:

好的,所以我有一个名为 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)

【问题讨论】:

  • .writerows 顾名思义会写入所有行,而您想要.writerow(最后没有s)会写入一行。另请参阅 Viktor 的回答。

标签: python csv sqlite


【解决方案1】:

你应该这样做:

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

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

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

【讨论】:

  • 太棒了。那肯定有帮助。我也忘记了我需要添加一个 SELECT 方法来获取数据,即code c.execute("SELECT * FROM inventory") 然后结合你的建议它起作用了。谢谢
【解决方案2】:

为了将标题放在第一行,建议对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()

【讨论】:

    【解决方案3】:

    使用 Pandas 应该更高效,并且需要更少的代码。您可以将 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 了解更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-27
      • 1970-01-01
      • 2017-04-03
      • 2017-07-17
      • 2014-12-02
      • 2011-02-22
      • 1970-01-01
      • 2013-06-24
      相关资源
      最近更新 更多