Je veux importer des données CSV et TSV dans SQLite DB avec Python! Ceci explique comment importer avec un seul script pour ces personnes.
Veuillez vous référer aux articles suivants pour savoir ce qu'est SQLite et comment le configurer. Technique de création d'environnement SQL local facile réalisée par Python et SQLite
Voir «Explication» ci-dessous pour savoir comment l'utiliser.
import_data_to_sqlite.py
import sqlite3
import csv
import os
#######↓ Modifiez les paramètres ici ↓#######
dbname = ''
target_table_name = ''
import_table_name = ''
is_create_table =
is_header_skip =
#####################################
#######↓ Importer la table de destination DDL ↓#######
sql_script = """
"""
#######################################
class ImportSQLite():
def __init__(self, dbname, target_table_name, import_data_name, is_create_table, is_header_skip=False, sql_create_table=None):
"""
Importer des fichiers csv ou tsv dans SQLite
:param dbname:texte Nom de la base de données de destination de la connexion
:param target_table_name:texte Nom de la table sur le DB à importer
:param import_data_name:texte Le nom des données que vous souhaitez importer
:param is_create_table:booléen Créer ou non une table dans laquelle importer
:param is_header_skip:booléen Ignorer l'en-tête des données à importer
:param sql_create_table:texte DDL de la table à importer
"""
self.dbname = dbname
self.target_table_name = target_table_name
self.import_data_name = import_data_name
self.is_create_table = is_create_table
self.is_header_skip = is_header_skip
_, raw_delimiter = os.path.splitext(import_data_name)
if raw_delimiter == '.csv':
self.delimiter = ','
elif raw_delimiter == '.tsv':
self.delimiter = '\t'
else:
raise ValueError('Import file should be csv or tsv.')
if is_create_table:
if not sql_create_table:
raise ValueError('It\'s necessary of sql to create table')
else:
self.sql_create_table = sql_create_table
def read_import_file(self):
with open(self.import_data_name, 'r', encoding='utf-8') as f:
reader = csv.reader(f, delimiter=self.delimiter)
if self.is_header_skip:
header = next(reader)
return [i for i in reader]
def pick_column_num(self, import_data):
"""
Calculer le nombre de colonnes dans le fichier d'importation
:param import_data: array(two-dimensional)
:return: int
"""
columns = []
for raw in import_data:
columns.append(len(raw))
if len(set(columns)) == 1:
return columns[0]
else:
raise ValueError('this import files has diffrenect column numbers.')
def insert_csv_file(self):
input_file = self.read_import_file()
column = self.pick_column_num(input_file)
val_questions = ['?' for i in range(column)]
cur.executemany("insert into {0} values ({1})".format(self.target_table_name, ','.join(val_questions)), input_file)
if __name__ == '__main__':
sql = ImportSQLite(
dbname=dbname,
target_table_name=target_table_name,
import_data_name=import_table_name,
is_create_table=is_create_table,
is_header_skip= is_header_skip,
sql_create_table=sql_script
)
conn = sqlite3.connect(sql.dbname)
cur = conn.cursor()
if sql.is_create_table:
cur.execute('drop table if exists {};'.format(target_table_name))
cur.execute(sql.sql_create_table)
sql.insert_csv_file()
conn.commit()
conn.close()
Nom de variable | Moule | Méthode de réglage |
---|---|---|
dbname | Text | Nom de base de données de la destination de connexion. Spécifiez sous la forme d'un chemin. |
target_table_name | Text | Le nom de la table sur le DB à importer |
import_table_name | Text | Le nom des données que vous souhaitez importer. Spécifiez sous la forme d'un chemin. |
is_create_table | Boolean(True or False) | Créer une table vers laquelle importer |
is_header_skip | Boolean(True or False) | S'il faut ignorer l'en-tête des données à importer |
--Lors de la création de la table de destination d'importation, si vous ne définissez pas la requête de création, elle échouera avec une erreur. --Si vous spécifiez un fichier autre que csv ou tsv comme entrée, il sera lu.
Par exemple, si vous disposez du CSV suivant et qu'il n'y a pas encore de table dans le DB de destination de la connexion
students.csv
id,name,class,blood_type
1,Mike,Moon,B
2,Bob,Song,A
3,Gonzalez,Star,AB
4,Alex,Moon,
Les éléments de réglage sont les suivants.
(Ouverture) import_data_to_sqlite.py
#######↓ Modifiez les paramètres ici ↓#######
dbname = 'test.db' # '/home/user/test.db'Peut également être spécifié sous la forme de
target_table_name = 'students'
import_table_name = 'students.csv' # '/home/user/students.csv'Peut être spécifié sous la forme de
is_create_table = True
is_header_skip = True
#################################
#######↓ Créer une table DDL pour la destination d'importation ↓#######
sql_script = """
create table students(
id integer,
name text,
class text,
blood_type text
);
"""
#######################################
Tout ce que vous avez à faire est de le démarrer normalement
kick.sh
$ python import_data_to_sqlite.py
C'est tout.
Recommended Posts