2010-07-12 4 views
0

j'ai un fichier csv semblable au suivant:pour ajouter des valeurs de colonne d'une manière spécifique dans un fichier csv en utilisant python

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 veux être en mesure d'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 Et je veux le compte final pour chaque telle valeur comme un tableau résumé:

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

comment puis-je implémenter cela?

+0

Ce n'est pas un csv, il n'y a pas de virgules! ;) – drxzcl

+0

bien qu'il n'apparaisse pas avec des virgules dans Excel ... et CSV ne signifie pas nécessairement séparés par des virgules .. il peut être tab seprarated aussi ... – newbie

+1

@newbie: personne n'est intéressé par votre date limite. Arrête de jouer avec les tags, merci. – SilentGhost

Répondre

0

Regardez le module csv. Ce que vous voulez faire est d'ouvrir le fichier avec un csv.reader. 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 à un nouveau csv.writer.

Vous devrez peut-être définir un dialecte car vous n'utilisez pas réellement le format CSV mais un format délimité par des tabulations.

+0

même si je lis une ligne à la fois, comment puis-je accumuler les résultats pour l1 seul, l2 seul et ainsi de suite .... et cela est nécessairement séparé par des virgules j'ai juste donné la table comme ça pour mieux comprendre .. – newbie

+1

Je peux, mais je ne le ferai pas. L'accumulation est une pratique de programmation de base. – drxzcl

+0

J'ai fait quelques modifications à la table ci-dessus ... j'ai maintenant réussi à l'obtenir dans le format ci-dessus ... cela va-t-il aider ?? – newbie

2

Quelque chose comme ça devrait fonctionner. Il faut 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 sorties

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

Testé avec Python 3.1.2. Dans Python 2.x, vous devrez modifier les appels open() pour utiliser le mode binaire et supprimer le bit newline=""). Vous pouvez également déposer l'appel à list() puisque dans 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) 
+0

im en utilisant python 2.7 ... j'ai changé la partie open() en "open ('test.csv', 'rb')) ... mais je reçois une erreur de syntaxe avec le" résultat [entrée [1] ] = list (map (operator.add, result [entrée [1]], [int (i) pour i dans l'entrée [2:]])) "line12 .... toute modification que je pourrais avoir à faire ?? – newbie

+0

Ah oui, supprimez le 'list()', qui n'est nécessaire que dans Python 3 car 'map' renvoie une vue au lieu d'une liste dans Python 3. –

Questions connexes