[PYTHON] Traitement en une seule ligne de la mémoire de boue (CSV)

J'avais une trace de ce que j'ai fait le mois dernier, mais une note quand je l'ai compilée. Comme indiqué ci-dessous, les données sont enregistrées au format CSV, et elles sont agrégées pour chaque colonne. (De plus, même si vous avez un indice en regardant les chiffres, veuillez le parcourir avec brio.)

4000,2000,5000,7000,20
4000,2000,5000,7000,20
4000,2000,5000,7000,20
4000,3500,6010,6000,20
4000,3500,6010,6000,20
4000,3500,6010,6000,20
4000,3500,6010,6000,20
4000,3500,6010,6000,20
4000,3500,6010,6000,20
4000,3500,6010,6000,20
4000,3500,6010,6000,20
4000,2000,5210,5200,20
4000,2000,5210,5200,20
4000,2000,5210,5200,20
4000,2000,5210,5200,20
4000,2000,5210,5200,20
6000,5000,7000,2000,20
4000,6000,6000,2000,20
1500,1500,2000,1000,20
1500,1500,2000,1000,1
1500,1500,2000,1000,1
1500,1500,2000,1000,1
1500,1500,2000,1000,1
1500,1500,2000,1000,1
1500,1500,2000,1000,1
1500,1500,2000,1000,1

La seule doublure à traiter est la suivante.

Bon mot


python -c "import csv;print([sum([int(m) for m in materials]) for materials in zip(*csv.reader(open('big.txt')))])"

Commentaire (peut-être) bien compris

Tout d'abord, lisez CSV. Donnez l'objet fichier ouvert à l'objet lecteur du module csv. Puisque l'objet de lecture est itérable, il peut être tourné avec for.

>>> import csv
>>> for r in  csv.reader(open('big.txt')):
...     print(r)
...
['4000', '2000', '5000', '7000', '20']
['4000', '2000', '5000', '7000', '20']
['4000', '2000', '5000', '7000', '20']
['4000', '3500', '6010', '6000', '20']
…

Ensuite, utilisez la fonction zip pour agréger les valeurs de chaque colonne. L'objet zip renvoyé par la fonction zip est également itérable, vous pouvez donc l'utiliser de la même manière. On peut voir que les valeurs de chaque colonne sont agrégées en tuple.

>>> z = zip(*csv.reader(open('big.txt')))
>>> for entry in z:
...     print(entry)
...
('4000', '4000', '4000', '4000', '4000', '4000', '4000', '4000', '4000', '4000', '4000', '4000', '4000', '4000', '4000', '4000', '6000', '4000', '1500', '1500', '1500', '1500', '1500', '1500', '1500', '1500')
('2000', '2000', '2000', '3500', '3500', '3500', '3500', '3500', '3500', '3500', '3500', '2000', '2000', '2000', '2000', '2000', '5000', '6000', '1500', '1500', '1500', '1500', '1500', '1500', '1500', '1500')
('5000', '5000', '5000', '6010', '6010', '6010', '6010', '6010', '6010', '6010', '6010', '5210', '5210', '5210', '5210', '5210', '7000', '6000', '2000', '2000', '2000', '2000', '2000', '2000', '2000', '2000')
('7000', '7000', '7000', '6000', '6000', '6000', '6000', '6000', '6000', '6000', '6000', '5200', '5200', '5200', '5200', '5200', '2000', '2000', '1000', '1000', '1000', '1000', '1000', '1000', '1000', '1000')
('20', '20', '20', '20', '20', '20', '20', '20', '20', '20', '20', '20', '20', '20', '20', '20', '20', '20', '20', '1', '1', '1', '1', '1', '1', '1')

Enfin, utilisez la fonction sum pour additionner les valeurs du tuple. Cependant, puisque la valeur lue par csv.reader est une chaîne de caractères, il est nécessaire de la convertir en int puis de la donner à la fonction sum.

>>> z = zip(*csv.reader(open('big.txt')))
>>> for entry in z:
...     print(sum([int(e) for e in entry]))
...
86000
67000
118130
107000
387

Recommended Posts

Traitement en une seule ligne de la mémoire de boue (CSV)
Traitement pleine largeur et demi-largeur des données CSV en Python
Divers traitements de Python
Traitement parallèle avec Parallel de scikit-learn
Post-traitement de python (NG)
Graphique de base à une ligne de HoloViews