Je poursuis mon apprentissage du langage Python mais ce n'est pas encore gagné...
Je bute sur un exercice où je dois importer un fichier heures.csv
nom,heures_travaillees
Pierre Durand,36
Paul Dupont,41
Edouard Gentil,40
à partir duquel je dois créer un nouveau salaire.csv qui permet d'obtenir le résultat des heures_travaillees * 15 qui donnerait
nom,salaire
Pierre Durand,540
Paul Dupont,615
Edouard Gentil,600
je n'arrive pas à consolider mon code Python pour faire ces deux actions. d'un coté j'arrive à importer le fichier mais je n'arrive pas à le modifier et d'un autre coté j'arrive à créer le nouveau csv si je définis manuellement les en-ente, lignes et calcul à faire pour chaque ligne.
Comment faire pour générer un code qui puisse me permettre de réaliser cet ensemble et simplement ?
Est-ce que tu lis tes entrées en format de listes de chaînes de caractères ou sous forme de dictionnaire? Si tu réussis à lire correctement le fichier d'enrtrée et si tu réussis à écrire le fichier de sortie, tu devrais pouvoir le faire Disons que les entrées sont dans row1 et les sorties seront dans row2. Tu pourrais faire: row2[1] = str(int(row1[1] * salaire_horaire)) N'oublie pas que les valeurs sont en caractères (str) et doivent être reconverties en caractères.
Le Tout est souvent plus grand que la somme de ses parties.
Comment lis-tu ton fichier csv? Tu devrais avoir les fonctions complémentaires pour créer le fichier de sortie. Pour éviter des problèmes, n'essaies pas de réécrire sur le même fichier pour commencer.
Le Tout est souvent plus grand que la somme de ses parties.
Ce qui peut mélanger est que les objets créés par csv.reader et csv.writer ne se comportent pas tout à fait de la même façon. L'objet créé par csv.reader est un générateur qqui nous fournit les informations quand on les demande dans un for par exemple. L'objet créé par csv.writer ressemble plus à une instance d'une classe qui reçoit les informations et les arrange correctement et les écrit sur le fichier (à notre insue, je trouve).
Le Tout est souvent plus grand que la somme de ses parties.
Merci à vous deux pour votre assistance. J'ai compris pourquoi je bloquais car je m'étais mis en tête de créer une fonction pour extraire les données de heures.csv, puis une autre fonction pour faire le calcul des heures en salaire, et une dernière pour associer le tout et enregistrer.
En reprenant le code de Diablo 76 (pour l'instant je n'ai pas encore vu panda je suis encore à l'apprentissage du langage de base), j'ai bien compris que l'on pouvait faire quasi tout avec une seule fonction (mais je n'arrive toujours pas à créer mon fichier de sortie)
le code :
import csv
def modify_csv(file_csv):
taux_horaire = 15
with open(file_csv) as csvfile:
dict_reader = csv.DictReader(csvfile)
for row in dict_reader:
salaire = int(row["heures_travaillees"]) * taux_horaire
row["heures_travaillees"] = str(salaire)
out = (row["nom"], row["heures_travaillees"])
print (out)
en_tete = ["nom", "salaire"]
writer = csv.writer(open('salaire.csv','w'), delimiter=',')
writer.writerow(en_tete)
writer.writerow(out)
modify_csv("heures.csv")
me donne uniquement 1 ligne de résultat
nom,salaire
Edouard Gentil,600
-----------------------------
Je comprends parfaitement les formules mais j'ai du mal à les créer et encore plus à penser à le faire et correctement en prime. Avez-vous des recommandations pour que je m'entraine sur des cas très simples. Autant j'ai appris SQL aisément mais je n'arrive pas à passer au niveau supérieur avec Python : je comprends le principe mais impossible d'écrire un code correct et c'est pas faute de remplir des lignes et des lignes de brouillons d'essais de code différent en vain
Sur ta ligne 13, tu ouvres le fichier de sortie? Tu le fais pour chaque entrée, donc tu détruis ce qui a été fait précédemment. Refait une autre boucle pour écrire après avoir fait les modifications.
Le Tout est souvent plus grand que la somme de ses parties.
Le problème était que tu ouvrais le fichier d'entrée avec un with open et le fichier de sortie autrement. En fait, c'était la chose à faire. Chaque entrée (row) est un dictionnaire. Il n'y a pas un dictionnaire pour tout le fichier. C'est en fait une liste de dictionnaires. Si tu avais utilisé csv.reader à la place, tu aurais une liste de listes. L'avantage du dictionnaire est qu'on se rappelle plus facilement le nom de chaque champs que son numéro de position dans la ligne. Et ces noms sont indiqués dans la ligne d'entête.
Le Tout est souvent plus grand que la somme de ses parties.
voila le code simplifié, le cast de la variable salaire n'est pas nécessaire :
import csv
def modify_csv(file_csv):
taux_horaire = 15
with open(file_csv) as csvfile:
dict_reader = csv.DictReader(csvfile)
en_tete = ["nom", "salaire"]
writer = csv.writer(open('output.csv','w'), delimiter=',')
writer.writerow(en_tete)
for row in dict_reader:
salaire = int(row["heures_travaillees"]) * taux_horaire
#row["heures_travaillees"] = str(salaire)
out = (row["nom"], salaire)
print (out)
writer.writerow(out)
modify_csv('input.csv')
- Edité par VincentGe 9 mai 2023 à 16:09:50
Python créer csv à partir d'un autre csv importé
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.