IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Script Python, traitement fichier csv


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Electromécanique
    Inscrit en
    Avril 2024
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Electromécanique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Avril 2024
    Messages : 19
    Points : 3
    Points
    3
    Par défaut Script Python, traitement fichier csv
    Bonjour,

    Je suis novice en Python, je connais juste les bases mais j'aurai besoin de créer un script qui traite un fichier csv avec séparateur "," pour le transformer en xls ou google sheet comportant les 2 colonnes initiales du csv puis qu'il retire dans la 2e colonne "kW" et qui calcule dans une 3e colonne dans la cellule 2 la moyenne des chiffres de la 2e colonne.

    Fichier de base (exemple):

    "Date", "Puissance"

    2024-01-12 10:00:00,93.3 kW

    2024-01-12 13:00:00,92.8 kW

    2024-01-12 16:00:00,92.2 kW

    2024-01-12 19:00:00,90.4 kW

    2024-01-12 22:00:00,89.6 kW

    2024-01-13 01:00:00,89.7 kW

    Peut-on m'aider?

    Complément: Peut-on passer au script un paramètre (le nom du fichier) exemple sub1.csv, sub2.csv?

    Merci beaucoup

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 582
    Points : 2 030
    Points
    2 030
    Par défaut
    Bonjour.

    Pour générer votre csv, regardez la doc de csv.DictWriter.
    Oups, j'avions mal lu

    Pour lire votre csv, regardez la doc de csv.DictReader.

    Supprimer " kW", si vous avez les bases en Python, absolument rien de sorcier.

    Idem pour générer votre 3ème valeur.

    Pour passer des arguments à votre script Python, voir https://python.developpez.com/cours/..._arguments.php. Là encore, rien de méchant.

    Et enfin, pour faire un fichier Excel par exemple, vous pouvez utiliser openpyxl.

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 720
    Points : 31 037
    Points
    31 037
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Dingobec Voir le message
    et qui calcule dans une 3e colonne dans la cellule 2 la moyenne des chiffres de la 2e colonne.
    Tout lire (les lignes ayant une valeur) en additionnant les valeurs puis ensuite écrire la ligne de titre en rajoutant en 2° colonne la moyenne ainsi calculée.

    Citation Envoyé par Dingobec Voir le message
    Complément: Peut-on passer au script un paramètre (le nom du fichier) exemple sub1.csv, sub2.csv?
    Tout à fait. C'est ce qu'on nomme les "arguments d'un programme".
    Il n'y a rien à faire, c'est automatique. Dès qu'on met des paramètres à un script, celui-ci les reçoit automatiquement. Tout ce qui reste à faire est de savoir où ils sont pour pouvoir aller les chercher et les récupérer.
    Ils sont dans la liste sys.argv. Donc il est nécessaire d'importer le module "sys" pour cela (import sys) puis une fois cette instruction posée, les arguments sont récupérables via sys.argv[1] (le premier nom passé à l'appel), sys.argv[2] (le second nom passé à l'appel), etc. Et sys.argv[0] contient le nom du programme tel qu'il a été appelé.

    Citation Envoyé par Arioch Voir le message
    Pour lire votre csv, regardez la doc de csv.DictReader
    (goûts et couleurs) j'aurais plutôt parlé de csv.reader peut-être plus simple pour un débutant (est-il à l'aise avec les dictionnaires ? un dictionnaire est-il vraiment utile ici ? etc).

  4. #4
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 886
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 886
    Points : 7 234
    Points
    7 234
    Par défaut
    Bonjour,

    Citation Envoyé par Dingobec
    qui calcule dans une 3e colonne dans la cellule 2 la moyenne des chiffres de la 2e colonne.
    EDIT: Précisé dans les messages suivants

    C'est quoi cette moyenne ? Une moyenne cumulative ?

    Avec pandas c'est rapide, mais pas pour les débutants, donc je le place juste pour la curiosité

    EDIT: Code modifié selon précision du PO.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    import pandas as pd
     
    chemin_csv = 'src/test.txt'
    chemin_xls = 'src/test.xlsx'
     
    df = pd.read_csv(chemin_csv, sep=',')
     
    df['Puissance'] = df['Puissance'].str.replace(' kW', '').astype(float)
     
    moyenne_puissance = df['Puissance'].mean()
     
    df['Moyenne'] = pd.NA
     
    df.loc[0, 'Moyenne'] = moyenne_puissance
     
    df.to_excel(chemin_xls, index=False, engine='openpyxl')

    Nom : Capture d’écran_2024-04-11_15-13-31.png
Affichages : 201
Taille : 10,6 Ko

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 720
    Points : 31 037
    Points
    31 037
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    C'est quoi cette moyenne ? Une moyenne cumulative ?
    Moi aussi j'ai pensé un peu à un truc dans le genre... puis j'ai révisé cette opinion en considérant plutôt qu'il voulait parler de la 3° colonne de la ligne de titre. Bon bref il nous dira mieux ce qu'il en est.

  6. #6
    Candidat au Club
    Homme Profil pro
    Electromécanique
    Inscrit en
    Avril 2024
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Electromécanique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Avril 2024
    Messages : 19
    Points : 3
    Points
    3
    Par défaut
    Comme je ne suis pas du tout du domaine et plutôt un vieux routard de l'électromécanique avec peu de connaissance en développement, les exemples vont m'aider.
    En fait dans la 3e colonne que j'ajoute au fichier j'aurai juste une case qui contiendrait la moyenne de tous les éléments de la 2e colonne

    Merci de votre super aide,

  7. #7
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 582
    Points : 2 030
    Points
    2 030
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    (goûts et couleurs) j'aurais plutôt parlé de csv.reader peut-être plus simple pour un débutant (est-il à l'aise avec les dictionnaires ? un dictionnaire est-il vraiment utile ici ? etc).
    Partant du principe que le PO a connaissance des bases en Python, je pars du principe que les listes, dictionnaires, tuples et leurs amis sont des notions connues. Et du coup, gérer dans un dictionnaire les données contenues dans le fichier csv fourni en entrée, moi ça me parle bien

    Mais oui, csv.reader peut tout aussi bien faire l'affaire.

  8. #8
    Candidat au Club
    Homme Profil pro
    Electromécanique
    Inscrit en
    Avril 2024
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Electromécanique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Avril 2024
    Messages : 19
    Points : 3
    Points
    3
    Par défaut
    Heu... comme dit je suis vraiment à mes premiers balbutiements en python que je découvre, par contre, je peux vous designer, concevoir et mettre en exploitation un datacenter Tiers 3 ou 4 les yeux fermés

    Donc au vue de tous vos commentaires, si je veux maintenant consolider, si on reprend mon exemple, sub1 + sub 2 dans un troisième fichier avec le même format, j'ouvre en lecture les 2 fichiers et en écriture un 3e fichier puis j'additionne ligne par ligne les éléments des 2 fichiers pour les envoyer dans le 3e? Est-ce que csv.reader fonctionne aussi pour ça ou il y a une meilleure méthode....On ne rigole pas svp

    Merci

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 720
    Points : 31 037
    Points
    31 037
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Dingobec Voir le message
    On ne rigole pas svp
    Non, on ne se moque jamais d'un débutant qui a bien compris que c'est à lui de bosser. Mais là en revanche il y a un souci soit de compréhension, soit de version.
    Dans ta première demande, j'avais compris (et à mon avis les autres aussi) que tu voulais prendre UN csv et le traiter, rajouter la moyenne, etc. Puis ensuite passer au suivant, le traiter etc.

    Maintenant il est question de prendre DEUX fichiers, les additionner (ce qui n'est alors plus du tout une moyenne) et créer un 3° fichier contenant la somme des deux.

    Fatalement les deux problèmes ne sont pas équivalents et ne se solutionneront pas de la même façon...

    Sinon pour répondre à ta question, csv.reader a juste pour but de lire un csv, rien de plus. Ce que tu fais de ce qu'il lit, c'est ton problème. Il n'ira jamais additionner, comparer, moyenner quoi que ce soit. Lui il lit et te donne ensuite la ligne lue découpée bien proprement. Et accessoirement si tu veux ensuite écrire ton résultat dans un csv (le même ou un autre) il te faut alors là passer par csv.writer (ou csv.DictWriter pour faire plaisir à Arioch ). Oui c'est logique, read(er) c'est pour read (lire) donc pour écrire (write) c'est (write)r

  10. #10
    Candidat au Club
    Homme Profil pro
    Electromécanique
    Inscrit en
    Avril 2024
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Electromécanique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Avril 2024
    Messages : 19
    Points : 3
    Points
    3
    Par défaut
    Merci pour la réponse précise et les infos.

    En fait concernant le premier point c'est OK, ça fonctionne bien et j'ai mes 2 premiers fichiers sub1 et sub2 de format identique
    Donc j'ai sub1 (une armoire électrique) et sub2 (une autre armoire électrique). La puissance totale de ma, disons sous station, devient donc sub1 et sub2 en un fichier sub1_sub2.xls
    Au final j'aurai bien 3 fichiers sub1, sub2 et sub1_sub2.
    Sous excel ils appellent ça "consolider", quelle serait donc la meilleure méthode dans un script python?

    Merci,

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 720
    Points : 31 037
    Points
    31 037
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Dingobec Voir le message
    quelle serait donc la meilleure méthode dans un script python?
    Moi j'aurais foutu sub1 dans un onglet excel, sub2 dans un autre et dans le 3° positionné des formules de calcul. C'est souple et évolutif (on change sub1 ou sub2 le calcul est refait immédiatement et on peut facilement rajouter des lignes).
    Python est un magnifique langage mais tout excellent qu'il soit, il ne sera jamais meilleur, pour manipuler du xls, que excel.

    Mais si tes raisons te font préférer Python (oui ça permet d'automatiser la création) alors
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    with open("sub1.csv", "r", encoding="utf-8") as f1, open("sub2.csv", "r", encoding="utf-8") as f2:
    	csv1=csv.reader(f1, delimiters=",")
    	csv2=csv.reader(f2, delimiters=",")
    	for (lig1, lig2) in zip(csv1, csv2): print(lig1, lig2)
    Voilà un petit ersatz de début. zip() associe 2 tableaux (les contenus de csv1 et csv2) qui sont alors lus en parallèles et stockés dans lig1 et lig2. Là ils sont ici affichés mais rien n'interdit de traiter lig1 et/ou lig2 (tous deux des tableaux) pour additionner les éléments qui t'intéressent.

  12. #12
    Candidat au Club
    Homme Profil pro
    Electromécanique
    Inscrit en
    Avril 2024
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Electromécanique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Avril 2024
    Messages : 19
    Points : 3
    Points
    3
    Par défaut
    Merci bien, en effet le but est d'automatiser cela à des fins de reporting mensuel et/ou annuel dans looker studio.

  13. #13
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 239
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 239
    Points : 1 809
    Points
    1 809
    Par défaut
    sinon Looker Studio ne pourrait pas gérer directement tes fichiers csv?

  14. #14
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 609
    Points : 2 073
    Points
    2 073
    Par défaut
    Je pense que la solution évoquée plus haut de passer par pandas est la plus efficace et au final, peut-être la plus simple.
    Sinon, il va falloir traiter des listes issues de plusieurs fichiers : bof à mon avis.

  15. #15
    Candidat au Club
    Homme Profil pro
    Electromécanique
    Inscrit en
    Avril 2024
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Electromécanique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Avril 2024
    Messages : 19
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Reprenant l'aide au script que vous m'avez aidé à mettre en place, je ne comprends pas comment je peux passer le nom du fichier csv en paramètre. Pouvez vous encore m'aider s'il vous plait.
    Voici donc le code inspiré par vos réponse:

    import pandas as pd

    chemin_csv = '/test/TGHQ2.csv'
    chemin_xls = '/test/TGHQ2.xlsx'

    df = pd.read_csv(chemin_csv, sep=',')

    df['Puissance'] = df['Puissance'].str.replace(' kW', '').astype(float)

    moyenne = df['Puissance'].mean()

    df['Moyenne'] = pd.NA

    df.loc[0, 'Moyenne'] = moyenne

    df.to_excel(chemin_xls, index=False, engine='openpyxl')

    Merci de votre grande aide.

  16. #16
    Candidat au Club
    Homme Profil pro
    Electromécanique
    Inscrit en
    Avril 2024
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Electromécanique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Avril 2024
    Messages : 19
    Points : 3
    Points
    3
    Par défaut
    Mon script se nomme TGHQ et donc je pense que je dois le lancer avec TGHQ(TGHQ2.csv)(par exemple) et ajouter l'import sys dans le script.
    J'ai essayé plusieurs manip avec sys.argv dans le script mais ça ne fonctionne pas, j'ai toujours une erreur

  17. #17
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 239
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 239
    Points : 1 809
    Points
    1 809
    Par défaut
    quelle erreur et quel est ton nouveau script avec argv ?

  18. #18
    Candidat au Club
    Homme Profil pro
    Electromécanique
    Inscrit en
    Avril 2024
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Electromécanique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Avril 2024
    Messages : 19
    Points : 3
    Points
    3
    Par défaut
    import pandas as pd
    import sys

    chemin_csv = '/test/',sys.argv[1],'.csv'
    chemin_xls = '/test/',sys.argv[1],'.xlsx'

    df = pd.read_csv(chemin_csv, sep=',')

    df['Puissance'] = df['Puissance'].str.replace(' kW', '').astype(float)

    moyenne = df['Puissance'].mean()

    df['Moyenne'] = pd.NA

    df.loc[0, 'Moyenne'] = float("%.2f" % moyenne)

    df.to_excel(chemin_xls, index=False, engine='openpyxl')

  19. #19
    Candidat au Club
    Homme Profil pro
    Electromécanique
    Inscrit en
    Avril 2024
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Electromécanique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Avril 2024
    Messages : 19
    Points : 3
    Points
    3
    Par défaut
    Je pensais que l'on pouvais faire ça mais je suis néophyte et je ne connais pas assez.

  20. #20
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 239
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 239
    Points : 1 809
    Points
    1 809
    Par défaut
    si, c'est faisable, mais là tu ne donnes pas ton script qui est censé utilisé argv (je ne le vois pas dans ton code).
    et pas l'erreur rencontrée.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [PYTHON 3.6] - Traitement Fichier CSV
    Par T16r0u dans le forum Général Python
    Réponses: 1
    Dernier message: 24/03/2021, 15h31
  2. Traitement fichier CSV et recherche de sous-chaines
    Par j.lasnier dans le forum ASP.NET
    Réponses: 2
    Dernier message: 23/03/2010, 11h31
  3. python et fichier .CSV
    Par billyrose dans le forum Général Python
    Réponses: 7
    Dernier message: 22/07/2008, 07h53
  4. Traitement fichiers csv
    Par athra dans le forum Forms
    Réponses: 0
    Dernier message: 20/06/2008, 11h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo