Partage
  • Partager sur Facebook
  • Partager sur Twitter

Traitement de fichier csv avec python ?

22 mars 2019 à 15:05:55

Bonjour,

Je viens vers vous pour avoir quelques conseils sur ce que j'essaie de mettre en place avec le python :


Je vais essayer d'être le plus précis et de détailler comme je peux ce que j'essaie de faire ! :p

J'ai fais un script en bash qui me permet de traiter mes fichiers csv. A partir d'un fichier csv contenant certains mots qui me servent de " clés ", je check deux autres fichiers csv. Pour exemple, voici les trois fichiers csv que je mets en arguments quand je lance mon script :

Fichier1.csv :

Lundi
Mardi
Fichier2.csv

XXXXXXXXX XXXXXXXXX XXXXXXXXXX Lundi
XXXXXXXXX XXXXXXXXX XXXXXXXXXX Samedi
XXXXXXXXX XXXXXXXXX XXXXXXXXXX Mardi
XXXXXXXXX XXXXXXXXX XXXXXXXXXX Lundi
XXXXXXXXX XXXXXXXXX XXXXXXXXXX Mardi
XXXXXXXXX XXXXXXXXX XXXXXXXXXX Vendredi
Fichier3.csv

XXXXXXXXX XXXXXXXXX XXXXXXXXXX Lundi
XXXXXXXXX XXXXXXXXX XXXXXXXXXX Lundi
XXXXXXXXX XXXXXXXXX XXXXXXXXXX Vendredi
XXXXXXXXX XXXXXXXXX XXXXXXXXXX Mardi
XXXXXXXXX XXXXXXXXX XXXXXXXXXX Mardi
XXXXXXXXX XXXXXXXXX XXXXXXXXXX Mercredi

 
Mon script analyse fichier2.csv et fichier3.csv, il extrait les lignes en fonction des mots clés présents dans fichier1.csv puis génère un fichier4.csv avec les lignes trouvées dans le fichier2.csv puis un fichier5.csv  pour le fichier3.csv. :

Fichier4.csv

XXXXXXXXX XXXXXXXXX XXXXXXXXXX Lundi
XXXXXXXXX XXXXXXXXX XXXXXXXXXX Lundi
XXXXXXXXX XXXXXXXXX XXXXXXXXXX Mardi
XXXXXXXXX XXXXXXXXX XXXXXXXXXX Mardi
Fichier5.csv

XXXXXXXXX XXXXXXXXX XXXXXXXXXX Lundi
XXXXXXXXX XXXXXXXXX XXXXXXXXXX Lundi
XXXXXXXXX XXXXXXXXX XXXXXXXXXX Mardi
XXXXXXXXX XXXXXXXXX XXXXXXXXXX Mardi

Il fusionne ensuite fichier4.csv et fichier5.csv entre eux  et génère un fichier_csv_final1.csv :

Fichier_csv_final1.csv
Fichier4.csv:       Fichier5.csv                        

XXXXX XXXX Lundi    XXXXX XXXX Lundi
XXXXX XXXX Lundi    XXXXX XXXX Lundi
XXXXX XXXX Mardi    XXXXX XXXX Mardi
XXXXX XXXX Mardi    XXXXX XXXX Mardi 


Mes fichiers CSV sont tous identiques dans leur forme, seul le contenu change. Ils ont tous 18 colonnes, mais seulement 4 d'entres elles m'intéressent, j'utilise donc un awk pour récupérer les 4 colonnes désirées.

Donc pour résumer : dans fichier4.csv et fichier5.csv,  on retrouve exactement les mêmes colonnes, dans le même ordre. Il y a juste deux colonnes qui séparent chaque les fichhiers histoire que ce soit plus lisible.

Dans les fichiers fusionnés, il y a une colonne qu'avec des valeurs numérique. Il faut imaginer que, par exemple, mes colonnes avec les valeurs numériques soient la première colonne du fichier4.csv et la première colonne du Fichier5.csv Mon scrit va extraire ces deux colonnes, va faire un fichier csv pour chaque colonne, va soustraire les colonnes entre elles et refaire un autre fichier résultat.csv.

Il va ensuite fusionner fichier_csv_final1.csv avec le fichier resultat.csv. Au final, mon script génère un fichier qui ressemble à ça :

Fichier_csv_final2.csv

Fichier_csv_final1.csv
Fichier4.csv:        Fichier5.csv:      Resultat.csv

XXXXX XXXXX Lundi   XXXXX XXXXX Lundi   Soustraction
XXXXX XXXXX Lundi   XXXXX XXXXX Lundi   Soustraction
XXXXX XXXXX Mardi   XXXXX XXXXX Mardi   Soustraction
XXXXX XXXXX Mardi   XXXXX XXXXX Mardi   Soustraction


Ça, j'arrive à le faire en bash. En étant sous Linux, ça marche niquel pour moi. Le problème, c'est que je dois le rendre compatible avec Windows. Du coup j'ai décidé de le faire en Python.

D'où mes questions :

- En bash j'utlise une bouche while read de ce type pour prendre que les 4 colonnes qui m'intéressent et filtrer les lignes en fonction des mots clé qui sont dans mon premier fichier csv :

while read jour
do
        awk -F',' '{print $1","$2","$15","$17}' "$2" | grep -w "$jour"
        echo""
        echo""

done <"$1" >"$3"


L'avantage c'est que ça me permet de traiter deux fichiers en même temps :

while read jour
do
        grep -wf "$1" "$2" | awk -F',' '{if(f!=$1)print"\n"; f=$1; print $0;}' | awk -F',' '{print $1","$2","$15","$17}' > test1.csv
        grep -wf "$1" "$3" | awk -F',' '{if(f!=$1)print"\n"; f=$1; print $0;}' | awk -F',' '{print $1","$2","$15","$17}' > test2.csv
done <"$1"


Pourriez-vous m'indiquer l'équivalent en Python ? J'ai beau chercher, je ne trouve pas !


Pour le moment, j'arrive à faire cela :

import csv

with open('Fichier1.csv') as csv_file:
	csv_reader = csv.reader(csv_file)

	for line in csv_reader:
		print(line[0], line[1], line[2], line[14], line[16])


Ce qui me permet de ne garder que les 4 colonnes dont j'ai besoin, mais il me manque le fait de pouvoir filtrer les lignes de mes fichiers.csv en fonction de valeur clé, présentent dans un autre fichier csv.

Je précise que je suis sous RedHat et que j'utilise la version 2.7.5 de python.
Merci d'avance et pardon pour le gros poste ! :D



-
Edité par Tyza 22 mars 2019 à 15:14:47

  • Partager sur Facebook
  • Partager sur Twitter

TicTacToe ( ou Morpion ) en bash avec un tableau multi-dimension : ici ! :)

22 mars 2019 à 15:33:19

Tu peux d'abord ouvrir le premier fichier pour récupérer les mots clés.

Ensuite tu crée un nouveau fichier avec csv.writer, puis tu écris seulement les lignes qui correspondent.

Exemple (non testé) :

import csv

with open("fichier1.csv") as f:
    reader = csv.reader(f)
    mots_cles = {line[0] for line in reader}

print(mots_cles)

with open("fichier_final.csv", "w") as f:
    writer = csv.writer(f)
    for filename in ["fichier1.txt", "fichier2.txt"]:
        with open(filename) as file:
            reader = csv.reader(file)
            for line in reader:
                if line[3] in mots_cles:
                    writer.writerow(line)


Au fait pourquoi tu n'utilises pas python3 ?

-
Edité par thelinekioubeur 22 mars 2019 à 15:40:05

  • Partager sur Facebook
  • Partager sur Twitter
22 mars 2019 à 16:11:25

Merci pour ton retour !

Je vais tester ta solution ! :)


J'ai suivi le guide d'installation sur le site de RedHat, mais rien n'y fait, je ne peux pas installer Python3. Je pense que ma boîte bloque l'installation.

Je vais voir avec eux !
  • Partager sur Facebook
  • Partager sur Twitter

TicTacToe ( ou Morpion ) en bash avec un tableau multi-dimension : ici ! :)

23 mars 2019 à 20:52:16

Il semblerait que quand je tente ta proposition, la console de sublime texte ne me renvoie que la liste des mot clés présent dans le premier fichier csv que j'ouvre !

Je vais peut-être regarder du côté de Panda ! Apparemment c'est fait pour traiter ce genre de chose ! :)

  • Partager sur Facebook
  • Partager sur Twitter

TicTacToe ( ou Morpion ) en bash avec un tableau multi-dimension : ici ! :)

23 mars 2019 à 21:08:13

Bonsoir,

Vu tes bases en python pour lire de simples fichiers texte, autant dire que ça risque d'être plus que périlleux en utilisant une usine à gaz comme pandas.

Si encore on avait pu comprendre ton besoin, on pourrait sans doute te guider, mais avoir à créer je ne sais combien de fichiers afin d'arriver à un fichier final, ça sent tellement la mauvaise conception que je ne m'y aventurerai pas. Tout cela pars déjà du bash où certainement une solution autre, pourrait être trouvé pour que toutes les infos se trouvent sur un seul fichier csv.

À moins d'exprimer mieux le problème, je vois pas comment t'aider, sinon te conseiller de rendre moins complexe ta résolution au problème (algorithme).

  • Partager sur Facebook
  • Partager sur Twitter

Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

23 mars 2019 à 21:28:52

Pandas est inutile pour ça.

Le code que je t'ai donné doit créer un fichier "fichier_final.csv", tu ne l'as pas ?

Il faut que tu adapte les index aussi.

-
Edité par thelinekioubeur 23 mars 2019 à 21:29:29

  • Partager sur Facebook
  • Partager sur Twitter
16 octobre 2019 à 10:09:07

Bonjour,

Je suis apprentie au sein d'un opérateur de télécommunications. Ma misions principale est de lire 3 fichiers .csv via un script en python et pour ensuite les relier en un seul fichier .csv. Pourrais-je savoir comment faire la fusion de ses trois fichiers .csv ?

  • Partager sur Facebook
  • Partager sur Twitter
18 mars 2020 à 9:20:38



-
Edité par NdeyeBatorSougou 18 mars 2020 à 9:21:25

  • Partager sur Facebook
  • Partager sur Twitter