Pages: 1
- Sujet précédent - [POSTGRES 9.4] Import multiple de csv via Python avec encodage UTF-8 - Sujet suivant
#1 Thu 18 May 2017 16:33
- lauriane
- Participant occasionnel
- Date d'inscription: 19 Mar 2013
- Messages: 21
[POSTGRES 9.4] Import multiple de csv via Python avec encodage UTF-8
Bonjour,
Je cherche à importer tous les csv présents dans un dossier de manière automatique via Python. Après avoir longtemps cherché sur internet, j’ai élaboré ce script :
import os
import fnmatch
import psycopg2
conn = psycopg2.connect("host=adresseIP port=5432 dbname=nom_db user=moi")
cur=conn.cursor()
for root, dirnames, filenames in os.walk(os.path.realpath(os.curdir)):
for csv in fnmatch.filter(filenames, '*.csv'):
f = open(csv, 'r')
cur.copy_from(f, "schema.table", sep=',')
f.close()
conn.commit()
conn.close()
Avec cette « solution », je me trouve déjà confronté à deux problèmes :
-j’aimerais qu’à l’arrivée la table créée puisse aller dans le bon schéma et surtout soit automatiquement nommée de la même manière que mon csv d’origine. Le souci c’est qu’en utilisant le copy_from, une table doit déjà être créée au préalable. Donc y-a-t-il possibilité de contourner le problème sans avoir à créer les tables au préalable ?
Et si jamais les tables doivent être créées au préalable, il faut que j’associe la bonne table sur PostGres au bon fichier csv en entrée.
-j’ai besoin que mon fichier csv soit encodé en UTF-8, or je ne vois pas de solution pour m’en assurer, sachant que je ne peux placer un autre argument dans mon copy_from.
En lançant ce script, je me trouve bien sûr confronté à une erreur :
cur.copy_from(f, "schema.table", sep=',')
DataError: extra data after last expected column
CONTEXT: COPY "table", line 1: "finess;etalab;16;22/12/2015;;;;NUM_VOIE;T_VOIE;N_VOIE;;;;;;CP_COM;;;;;;;;;;;;;;;;"
Avez-vous déjà eu affaire à ce problème ? A savoir importer plusieurs csv dans PostGres via Python ?
Je précise que je travaille sous un environnement Windows (mais si vous avez la solution en Linux, je suis preneuse) et sur PostGres 9.4.
Merci !
Hors ligne
#2 Thu 18 May 2017 17:19
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: [POSTGRES 9.4] Import multiple de csv via Python avec encodage UTF-8
Bonsoir,
Le séparateur est le point-virgule dans vos fichiers apparemment, pas la virgule:
Code:
cur.copy_from(f, "schema.table", sep=';')
Nicolas
Hors ligne
#3 Thu 18 May 2017 17:26
- lauriane
- Participant occasionnel
- Date d'inscription: 19 Mar 2013
- Messages: 21
Re: [POSTGRES 9.4] Import multiple de csv via Python avec encodage UTF-8
Bonsoir,
Merci pour votre réponse. En effet je n'avais pas vu, mais après modification, l'erreur reste la même.
Hors ligne
#4 Sat 20 May 2017 10:59
- JD
- Moderateur
- Date d'inscription: 8 Aug 2013
- Messages: 726
Re: [POSTGRES 9.4] Import multiple de csv via Python avec encodage UTF-8
Bonjour,
Comme vous le soulignez copy_from qui est basé sur la commande COPY FROM de postgres suppose que la structure de la table soit déjà créée.
Le problème c'est qu'il va falloir coder pour récupérer la structure de chaque csv, c'est compliqué.
Bref je vous propose une solution avec les modules sqlalchemy et pandas.
L'avantage, c'est que ce code créera la structure de la table avant l'import.
Code:
#coding : utf-8 import os import fnmatch import sqlalchemy import pandas folder_path = ur'C:\mon\dossier\' #https://suhas.org/sqlalchemy-tutorial/ def connect(user, password, db, host='localhost', port=5432): '''Returns a connection''' uri = 'postgresql://{}:{}@{}:{}/{}' uri = uri.format(user, password, host, port, db) con = sqlalchemy.create_engine(uri, client_encoding='utf8') return con con = connect(user='moi', password='mdp', db='nom_db') for root, dirnames, filenames in os.walk(folder_path): for csv in fnmatch.filter(filenames, '*.csv'): filepath = os.path.join(root, csv) data_frame = panda.read_csv(filepath, sep=';') table = os.path.splitext(csv)[0] #nom du fichier csv sans l'extension schema = 'mon_schema' #je ne sais pas comment vous voulez assigner le nom du schema #http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_sql.html data_frame.to_sql(name=table, con, schema=schema, if_exists='replace')
Cordialement,
Dernière modification par lejedi76 (Sat 20 May 2017 16:07)
Hors ligne
Pages: 1
- Sujet précédent - [POSTGRES 9.4] Import multiple de csv via Python avec encodage UTF-8 - Sujet suivant