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 !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Suite à un problème technique intervenu entre le 22 et le 23 mars, nous avons du procéder dans la soirée du 25 mars, à la restauration de la base de données du 24 mars (matinée).

En clair, nous avons perdu vos contributions et inscriptions du dimanche 24 et du lundi 25 mars.
Nous vous prions de nous excuser.

#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: 1534

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

En 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: 722

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

 

#5 Sat 20 May 2017 11:59

jmarsac
Participant assidu
Lieu: NICE
Date d'inscription: 26 Oct 2005
Messages: 566
Site web

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

Bonjour,
Vous pouvez regarder pgloader


Jean-Marie
Azimut

Hors ligne

 

Pied de page des forums

Powered by FluxBB