2

以下のような入力 csv ファイルがあります。最新の 8 つのエントリのみを印刷したいのですが、これを行う方法について誰かが入力できますか?

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']

コード:

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
4

3 に答える 3

4

n=8 の deque でtail レシピを使用できます。

これにより、アイテムを最後 (右) に追加すると、最初 (左) のアイテムが効率的にポップオフされ、長さを最大長以下に保つ両端キューが作成されます。

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

csv.readerオブジェクトは反復子です。長さが制限された両端キューを csv リーダーに適用すると、準備完了です。

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

10行の例では、これは次のように出力されます:

['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']
于 2013-06-27T03:51:21.387 に答える
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
于 2013-06-27T03:50:01.980 に答える
0

メモリ/パフォーマンスが問題にならない場合は、次のようにします。

for row in list(cr)[-8:]:  
    print row
于 2013-06-27T03:38:20.353 に答える