8 votes

Ecrire au format CSV à partir d'une base de données sqlite3 en python

J'ai une base de données appelée cars.db qui contient une table == inventory,

L'inventaire contient essentiellement

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

J'ai ensuite écrit ceci qui est censé éditer le fichier csv, mais je n'arrive pas à m'y retrouver, dans certains cas, j'obtiens des choses qui s'impriment mais qui ne sont pas correctes, et quand j'essaie de les corriger, rien ne s'imprime. Je ne sais pas si je peux faire quelque chose, mais j'ai besoin d'aide.

#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)

10voto

Viktor Kerkez Points 11222

Vous devriez vous contenter de le faire :

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

Si la raison pour laquelle vous itérez à travers les lignes est que vous souhaitez les prétraiter avant de les écrire dans le fichier, alors utilisez la fonction writerow méthode :

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

1voto

GERMAN RODRIGUEZ Points 119

Afin de placer les titres dans la première ligne, l'approche dictionnaire est suggérée pour la table inventaire dans 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()

0voto

Powers Points 1742

L'utilisation de Pandas devrait être plus performante et nécessiter moins de code. Vous pouvez enregistrer les données d'une table sqlite dans un DataFrame Pandas, puis utiliser Pandas pour écrire le fichier CSV.

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

Voici le code complet qui crée votre table sqlite avec de fausses données :

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')

Voici un code permettant d'écrire toutes les tables d'une base de données sqlite sous forme de fichiers CSV en une seule commande :

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')

Véase aquí pour plus d'informations.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X