Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

GeoRezo vous rend service, faites un don.

Merci à tous pour votre fidélité.

L'équipe GeoRezo

#1 jeu. 18 mai 2017 16:33

lauriane
Membre
Date d'inscription: 19 mars 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 jeu. 18 mai 2017 17:19

Nicolas Ribot
Moderateur
Lieu: Toulouse
Date d'inscription: 9 sept. 2005
Messages: 1019

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 jeu. 18 mai 2017 17:26

lauriane
Membre
Date d'inscription: 19 mars 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 sam. 20 mai 2017 10:59

lejedi76
Membre
Date d'inscription: 8 août 2013
Messages: 239

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 (sam. 20 mai 2017 16:07)

Hors ligne

 

#5 sam. 20 mai 2017 11:59

jmarsac
Membre
Lieu: NICE
Date d'inscription: 26 oct. 2005
Messages: 216
Site web

Re: [POSTGRES 9.4] Import multiple de csv via Python avec encodage UTF-8

Bonjour,
Vous pouvez regarder pgloader


Jean-Marie

Hors ligne

 

Pied de page des forums

Powered by FluxBB

Partagez  |