2016-01-30 3 views
2

J'ai un grand fichier .csv et je veux le traiter avec, peut-être un script python, et trouver toutes les valeurs qui sont "malformées", par exemple. ceux qui ont plus ou moins de valeurs que le nombre d'en-têtes et les éliminent.éliminer les enregistrements malformés d'un grand fichier .csv

Quelle est la meilleure façon de faire cela?

+1

'(ligne par ligne dans le fichier si la ligne. count (',')! = n) ' – GingerPlusPlus

+0

Utilisez la classe' csv.reader' documentée [ici] (https://docs.python.org/3.5/library/csv.html). Chaque ligne est représentée sous forme de liste. La longueur de cette liste représente donc le nombre de colonnes dans cette rangée particulière. – Archimaredes

+0

aha- donc compter le nombre de valeurs dans une ligne et si ce n'est pas correct- le supprimer? ou ne l'écrivez pas à la sortie? –

Répondre

1

Voici un exemple de base:

num_headers = 5 
with open("input.csv", 'r') as file_in, open("output.csv", 'w') as file_out: 
    for i, line in enumerate(file_in): 
     if len(line.split(",")) == num_headers: 
      file_out.write(line) 
     else: 
      print "line %d is malformed" % i 

ou en utilisant le module csv (qui est plus souple pour les différents types de mise en forme CSV):

import csv 
num_headers = 5 
with open("input.csv", 'r') as file_in, open("output.csv", 'w') as file_out: 
    csv_in = csv.reader(file_in) 
    csv_out = csv.writer(file_out) 
    for i, row in enumerate(csv_in): 
     if len(row) == num_headers: 
      csv_out.writerow(row) 
     else: 
      print "line %d is malformed" % i 
+0

est ce python 2? J'ai l'erreur "IOError: le fichier n'est pas ouvert pour l'écriture" –

+0

Désolé, mon mauvais. file_out doit être ouvert en mode écriture. J'ai mis à jour mon code pour corriger cela et inclure un deuxième exemple. – tjohnson

+0

Oui, c'est Python 2. Il devrait fonctionner en Python 3 si vous changez l'instruction print en une fonction print: _print ("line% d est mal formé"% i) _ – tjohnson