J'ai un fichier CSV et je souhaite importer ce fichier en masse dans ma base de données sqlite3 en utilisant Python. la commande est ".import .....". mais il semble que cela ne peut pas fonctionner comme ça. Quelqu'un peut-il me donner un exemple de la façon de le faire dans sqlite3? J'utilise Windows au cas où. Merci
106
Réponses:
la source
not all arguments converted during string formatting
quand j'essaye cette méthode.La création d'une connexion sqlite à un fichier sur le disque reste un exercice pour le lecteur ... mais il y a maintenant un two-liner rendu possible par la bibliothèque pandas
la source
df
, j'ai donc raccourci votre exemple à:pandas.read_csv(csvfile).to_sql(table_name, conn, if_exists='append', index=False)
Mes 2 cents (plus générique):
la source
La
.import
commande est une fonctionnalité de l'outil de ligne de commande sqlite3. Pour le faire en Python, vous devez simplement charger les données en utilisant toutes les fonctionnalités de Python, telles que le module csv , et en insérant les données comme d'habitude.De cette façon, vous avez également le contrôle sur les types insérés, plutôt que de vous fier au comportement apparemment non documenté de sqlite3.
la source
la source
Merci beaucoup pour la réponse de Bernie ! J'ai dû le peaufiner un peu - voici ce qui a fonctionné pour moi:
Mon fichier texte (PC.txt) ressemble à ceci:
la source
Vous avez raison, c'est
.import
la voie à suivre, mais c'est une commande du shell SQLite3.exe. Un grand nombre des principales réponses à cette question impliquent des boucles python natives, mais si vos fichiers sont volumineux (les miens sont de 10 ^ 6 à 10 ^ 7 enregistrements), vous voulez éviter de tout lire dans des pandas ou d'utiliser une compréhension / boucle de liste python native (bien que je ne les ai pas chronométrés pour comparaison).Pour les fichiers volumineux, je pense que la meilleure option est de créer la table vide à l'avance en utilisant
sqlite3.execute("CREATE TABLE...")
, de supprimer les en-têtes de vos fichiers CSV, puis de l'utilisersubprocess.run()
pour exécuter la déclaration d'importation de sqlite. Puisque la dernière partie est, je crois, la plus pertinente, je vais commencer par là.subprocess.run()
Explication
À partir de la ligne de commande, la commande que vous recherchez est
sqlite3 my.db -cmd ".mode csv" ".import file.csv table"
.subprocess.run()
exécute un processus de ligne de commande. L'argument tosubprocess.run()
est une séquence de chaînes qui sont interprétées comme une commande suivie de tous ses arguments.sqlite3 my.db
ouvre la base de données-cmd
flag après que la base de données vous permet de transmettre plusieurs commandes de suivi au programme sqlite. Dans le shell, chaque commande doit être entre guillemets, mais ici, elles doivent juste être leur propre élément de la séquence'.mode csv'
fait ce que vous attendez'.import '+str(csv_file).replace('\\','\\\\')+' <table_name>'
est la commande d'importation.Malheureusement, puisque le sous-processus transmet toutes les suites à des
-cmd
chaînes entre guillemets, vous devez doubler vos barres obliques inverses si vous avez un chemin de répertoire Windows.En-têtes de décapage
Pas vraiment le point principal de la question, mais voici ce que j'ai utilisé. Encore une fois, je ne voulais à aucun moment lire tous les fichiers en mémoire:
la source
Basé sur la solution Guy L (Love it) mais peut gérer les champs échappés.
la source
Vous pouvez le faire en utilisant
blaze
etodo
efficacementOdo stockera le fichier csv dans
data.db
(base de données sqlite) sous le schémadata
Ou vous utilisez
odo
directement, sansblaze
. Dans les deux cas, c'est bien. Lisez cette documentationla source
Si le fichier CSV doit être importé dans le cadre d'un programme python, pour plus de simplicité et d'efficacité, vous pouvez utiliser
os.system
les lignes suggérées par ce qui suit:Le fait est qu'en spécifiant le nom de fichier de la base de données, les données seront automatiquement enregistrées, en supposant qu'il n'y ait aucune erreur de lecture.
la source
la source
dans un souci de simplicité, vous pouvez utiliser l'outil de ligne de commande sqlite3 du Makefile de votre projet.
make test.sql3
crée ensuite la base de données sqlite à partir d'un fichier test.csv existant, avec une seule table "test". vous pouvez ensuitemake test.dump
vérifier le contenu.la source
J'ai constaté qu'il peut être nécessaire de fractionner le transfert de données du csv vers la base de données par morceaux pour ne pas manquer de mémoire. Cela peut être fait comme ceci:
la source