web-dev-qa-db-fra.com

Suppression de lignes avec Python dans un fichier CSV

Tout ce que je voudrais faire est de supprimer une ligne si sa valeur est "0" dans la troisième colonne. Un exemple de données serait quelque chose comme: 

6.5, 5.4, 0, 320
6.5, 5.4, 1, 320

Ainsi, la première ligne devra être supprimée tandis que la seconde restera.

Ce que j'ai jusqu'ici est comme suit:

import csv
input = open('first.csv', 'rb')
output = open('first_edit.csv', 'wb')
writer = csv.writer(output)
for row in csv.reader(input):
    if row[2]!=0:
        writer.writerow(row)
input.close()
output.close()

Toute aide est la bienvenue

13
Will B

Vous êtes très proche; vous comparez actuellement le row[2] avec l'entier 0, faites la comparaison avec la chaîne "0". Lorsque vous lisez les données d'un fichier, il s'agit d'une chaîne et non d'un entier. C'est pourquoi votre vérification d'entier échoue actuellement:

row[2]!="0":

De même, vous pouvez utiliser le mot clé with pour rendre le code actuel légèrement plus pythonique, de sorte que les lignes de votre code soient réduites et que vous puissiez omettre les instructions .close:

import csv
with open('first.csv', 'rb') as inp, open('first_edit.csv', 'wb') as out:
    writer = csv.writer(out)
    for row in csv.reader(inp):
        if row[2] != "0":
            writer.writerow(row)

Notez que input est une commande intégrée à Python. J'ai donc utilisé un autre nom de variable.


Edit: Les valeurs des lignes de votre fichier csv sont séparées par une virgule et; Dans un CSV normal, ils seraient simplement séparés par des virgules et une vérification avec "0" fonctionnerait. Vous pouvez donc utiliser strip(row[2]) != 0 ou vérifier avec " 0".

La meilleure solution serait de corriger le format csv, mais si vous souhaitez conserver le format actuel, les opérations suivantes fonctionneront avec votre format de fichier csv:

$ cat test.py 
import csv
with open('first.csv', 'rb') as inp, open('first_edit.csv', 'wb') as out:
    writer = csv.writer(out)
    for row in csv.reader(inp):
        if row[2] != " 0":
            writer.writerow(row)
$ cat first.csv 
6.5, 5.4, 0, 320
6.5, 5.4, 1, 320
$ python test.py 
$ cat first_edit.csv 
6.5, 5.4, 1, 320
16
mu 無

Vous devriez avoir if row[2] != "0". Sinon, il ne vérifie pas si la valeur de la chaîne est égale à 0.

1