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

Suite à un problème sur notre serveur une intervention a été planifiée ce  matin. La coupure, qui ne devait pas exéder 5 mn, a duré plus longtemps que prévu. L'intervention consistait à l'augmentation de l'espace disque (GeoRezo prend un peu plus de place en viellissant). Malheureusement, le serveur se faisant vieux, quelques soucis ont eu lieu.

Nous avons procédé à un gros nettoyage d'automne : augmentation de l'espace disque, mise à jour des certificats SSL pour l'utilisation des  urls en https, upgrade d'Apache et autres outils nécessaire au bon fonctionnement.

Notre volonté à long terme est de consolider la plateforme GeoRezo et nous accueillons toutes personnes intéressées pour nous aider (technologies utilisées : drupal, docker, MySQL, git, etc.) Si vous désirez contribuer à un projet dynamique et apprendre de nouvelles choses, contactez nous !

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: 1015

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: 234

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: 212
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  |