2010-07-11 6 views
1

j'ai le code suivant ...lecture colonne de fichier csv et l'extraction en utilisant python

reader=csv.DictReader(open("test1.csv","r")) 
allrows = list(reader) 

keepcols = [c for c in allrows[0] if all(r[c] != '0' for r in allrows)] 

print keepcols 
writer=csv.DictWriter(open("output1.csv","w"),fieldnames='keepcols',extrasaction='ignore') 
writer.writerows(allrows) 

i un fichier csv qui a environ 45 Col. ..
la première colonne a quelques noms ..
sauf la première colonne, tous les autres ont seulement 0 et 0 ... et bien sûr, la table entière a aussi des titres ..
im essayant de lire les colonnes du fichier csv et j'ai besoin d'extraire seulement les cols avec 1 Le problème est le fichier de sortie est vide, même si le problème est que le fichier de sortie est vide, même si
il y a quelques colonnes dans la table 1 de ..

Quelqu'un pourrait-il s'il vous plaît aidez-moi .... :(im coincé terriblement ..

Title 3003_contact 3003_backbone 3003_sidechain 3003_polar 3003_hydrophobic 3003_acceptor 3003_donor 3003_aromatic 
l1 1 1 0 1 1 0 0 0 
l1 1 0 1 0 0 0 1 0 
l1 1 0 0 0 0 0 0 0 
l1 1 0 0 0 1 0 0 1 
l1 1 0 0 0 0 0 0 0 
l2 1 0 0 0 1 0 0 0 
l2 1 0 0 0 0 1 0 0 
l3 1 0 0 0 0 0 0 0 
l3 1 0 0 0 0 0 1 0 
l3 1 0 0 0 0 0 0 1 
l3 1 0 0 0 0 0 0 0 
l3 1 0 0 0 0 0 0 0 
l4 1 0 0 0 0 0 0 0 
l4 1 0 0 0 0 0 0 0 
l4 1 0 0 0 0 0 0 0 

retourne seulement la colonne 1 ... Je ai essayé de changer « keepcols » à keepcols ... et je reçois colonne2 d'abord et cOLUMN1 puis en sortie

Répondre

4

Edit: Si le fichier d'entrée est un fichier de valeurs séparées par des virgules, puis pour maintenir l'ordre des clés , utilisez reader.fieldnames au lieu des touches dans allrows[0].

Donc, la solution serait:

keepcols = [c for c in reader.fieldnames if any(r[c] != '0' for r in allrows)] 

Le fichier d'entrée affiché ci-dessus ressemble, il a des colonnes séparées par des espaces. Dans ce cas, je ne pense pas que csv soit le bon outil pour l'analyser. , Vous pouvez utiliser à la place split:

import csv 
with open("test1.csv","r") as f: 
    fields=next(f).split() 
    # print(fields) 
    allrows=[] 
    for line in f: 
     line=line.split() 
     row=dict(zip(fields,line)) 
     allrows.append(row) 
     # print(row) 
    keepcols = [c for c in fields if any(row[c] != '0' for row in allrows)] 
    print keepcols 
    writer=csv.DictWriter(open("output1.csv","w"),fieldnames=keepcols,extrasaction='ignore') 
    writer.writerows(allrows) 

Edit2: La raison pour laquelle l'ordre des colonnes changeait parce que for c in allrows[0] renvoie les clés de allrows[0] dans un ordre quelconque. Les touches dict ne sont pas commandées par défaut. Le code ci-dessus fonctionne autour de cela en définissant fields comme une liste, pas un dict.

réponse originale: changement fieldnames='keepcols'-fieldnames=keepcols.

fieldnames doit être une séquence de clés, telle que ['fieldA','fieldB',...].

Un piège potentiel à connaître en Python est que les chaînes sont des séquences. Lorsque vous parcourez une chaîne, vous obtenez les caractères de la chaîne. Donc, quand vous dites fieldnames='keepcols', vous définissez fieldnames comme étant la séquence de caractères ['k','e','e','p','c','o','l','s']. Vous n'obtenez pas d'erreur car il s'agit d'une séquence de clés valide. Mais votre liste de dicts, allrows n'a pas ces clés. writer.writerows ignore allègrement cela depuis extrasaction='ignore'.

+0

essayé de changer ... je reçois colonne2 d'abord, puis colonne1 seulement comme sortie ... les cols rémanents n'apparaissent pas ... mais j'ai besoin d'extraire une colonne même si elle a un seul 1 ... s'il vous plaît aider. ... – beginner

+0

donc wat devrais-je faire à ce sujet .. je suis vraiment perdu ... :( – beginner

+0

Changer le 'all' à' any' En passant, que vous vouliez ce n'était pas très clair de l'original question – bernie

Questions connexes