0 votes

ajouter des valeurs de colonnes d'une manière spécifique dans un fichier csv en utilisant python

J'ai un fichier csv similaire au suivant :

title  title2  h1  h2  h3 ... 
l1.1     l1     1   1   0  
l1.2     l1     0   1   0
l1.3     l1     1   0   1
l2.1     l2     0   0   1
l2.2     l2     1   0   1
l3.1     l3     0   1   1
l3.2     l3     1   1   0
l3.3     l3     1   1   0
l3.4     l3     1   1   0    

Je souhaite pouvoir ajouter les colonnes de la manière suivante :
h1 ( l1.1 + l1.2+ l1.3 ) = 2
h1 ( l2.1 + l2.2 ) = 1
h1 ( l3.1 + l3.2 + l3.3 +l3.4) = 3 et ainsi de suite pour chaque colonne Je souhaite obtenir le décompte final de chacune de ces valeurs sous la forme d'un tableau récapitulatif :

title2  h1  h2  h3...
l1     2   2   1
l2     1   0   2
l3     3   4   1

Comment puis-je mettre cela en œuvre ?

1voto

Tim Pietzcker Points 146308

Une solution de ce type devrait fonctionner. Il prend une entrée sous la forme

title,title2,h1,h2,h3
l1.1,l1,1,1,0
l1.2,l1,0,1,0
l1.3,l1,1,0,1
l2.1,l2,0,0,1
l2.2,l2,1,0,1
l3.1,l3,0,1,1
l3.2,l3,1,1,0
l3.3,l3,1,1,0
l3.4,l3,1,1,0

et les sorties

title2,h1,h2,h3
l1,2,2,1
l2,1,0,2
l3,3,4,1

Testé avec Python 3.1.2. Avec Python 2.x, vous devrez modifier l'attribut open() afin d'utiliser le mode binaire, et de supprimer l'option newline="" bit). Vous pouvez également passer l'appel à list() depuis Python 2.x, map() renvoie déjà une liste.

import csv
import operator

reader = csv.reader(open("test.csv", newline=""), dialect="excel")
result = {}

for pos, entry in enumerate(reader):
    if pos == 0:
        headers = entry
    else:
        if entry[1] in result:
            result[entry[1]] = list(map(operator.add, result[entry[1]], [int(i) for i in entry[2:]]))
        else:
            result[entry[1]] = [int(i) for i in entry[2:]]

writer = csv.writer(open("output.txt", "w", newline=""), dialect="excel")
writer.writerow(headers[1:])

keys = sorted(result.keys())
for key in keys:
    output = [key]
    output.extend(result[key])
    writer.writerow(output)

0voto

drxzcl Points 2156

Jetez un coup d'œil au module csv. Ce que vous voulez faire, c'est ouvrir le fichier avec un lecteur csv. Ensuite, vous itérez sur le fichier, une ligne à la fois. Vous accumulez les résultats des ajouts dans une liste temporaire. Lorsque vous avez terminé, vous écrivez cette liste dans un nouveau csv.writer.

Il se peut que vous deviez définir un dialecte car vous n'utilisez pas vraiment CSV mais un format délimité par des tabulations.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X