2013-06-27 6 views
1

J'ai un fichier csv d'entrée comme ci-dessous, je veux imprimer seulement les 8 entrées les plus récentes.peut-on fournir des entrées sur la façon de faire cela?impression seulement les 8 dernières entrées dans un fichier .csv

INPUT:- 
trend.csv 

['2013-06-25 20:01', '10'] 
['2013-06-25 20:06', '9'] 
['2013-06-25 20:06', '8'] 
['2013-06-26 20:06', '7'] 
['2013-06-26 20:06', '6'] 
['2013-06-26 20:06', '5'] 
['2013-06-26 20:06', '4'] 
['2013-06-26 20:06', '3'] 
['2013-06-26 20:06', '2'] 
['2013-06-26 20:08', '1'] 

OUTPUT:- 
['2013-06-25 20:06', '8'] 
['2013-06-26 20:06', '7'] 
['2013-06-26 20:06', '6'] 
['2013-06-26 20:06', '5'] 
['2013-06-26 20:06', '4'] 
['2013-06-26 20:06', '3'] 
['2013-06-26 20:06', '2'] 
['2013-06-26 20:08', '1'] 

code:

import csv 
#Now read the recent 8 entries and print 
cr = csv.reader(open("trend.csv","rb")) 

for row in cr: 
    #print only the recent most 8 entries 
    print row 
+0

Avez-vous essayé le stockage 8 entrées? –

+0

@ IgnacioVazquez-Abrams - J'aimerais stocker seulement 8 entrées ..bot sûr de savoir comment faire si .. toutes les entrées? – user2341103

+0

@ IgnacioVazquez-Abrams - je reçois un fichier Erro "de database.py", ligne 17, dans last8 = collections.deque (maxlength = 8) TypeError: 'maxlength' est un argument de mot-clé non valide pour cette fonction – user2341103

Répondre

4

Vous pouvez utiliser le tail recipe avec un deque avec n = 8.

Cela crée une Deque où l'ajout d'un élément à la fin (à droite) sera efficace crèveront un élément au début (à gauche) pour maintenir la longueur plus que la longueur max:

>>> from collections import deque 
>>> deque(range(10000),8) 
deque([9992, 9993, 9994, 9995, 9996, 9997, 9998, 9999], maxlen=8) 

L'objet csv.reader est un itérateur. Appliquer une deque longueur limitée au lecteur csv et vous êtes bon pour aller:

import csv 
from collections import deque 

with open('/tmp/trend.csv','rb') as fin: 
    deq=deque(csv.reader(fin),8) 

for sub_list in deq: 
    print sub_list 

Avec votre exemple 10 ligne, cette impression:

['2013-06-25 20:06', '8'] 
['2013-06-26 20:06', '7'] 
['2013-06-26 20:06', '6'] 
['2013-06-26 20:06', '5'] 
['2013-06-26 20:06', '4'] 
['2013-06-26 20:06', '3'] 
['2013-06-26 20:06', '2'] 
['2013-06-26 20:08', '1'] 
+0

je reçois une erreur NameError: le nom 'reader' n'est pas défini – user2341103

+0

Avez-vous utilisé exactement ce code? 'lecteur' est l'objet csv défini ci-dessus. C'est «cr» dans votre code ... – dawg

+0

+1 nice! Mais utilisez '' rb'' pour 'open' avec un' csv' (ou 'newline = ''' dans Python 3). –

0

Si la mémoire/performance n'est pas une question que vous pourriez faire:

for row in list(cr)[-8:]: 
    print row 
1
import csv 

# Open the file with a "with" statement to provide automatic cleanup 
# in case of exceptions. 
with open("trend.csv","rb") as file: 
    cr = csv.reader(file) 
    lines = [row for row in cr] 
# Use slice notation and the wonderful fact that python treats 
# negative indices intelligently! 
for line in lines[-8:]: 
    print line 
Questions connexes