6

データ ウェアハウス (Cognos) から取得した CSV ファイルを使用してデータ分析に取り組んでいます。CSV ファイルには、上記のすべての行を合計する最後の行がありますが、分析にはこの行は必要ないため、最後の行をスキップしたいと思います。

以下のように、「for」ループ内で列名をチェックする「if」ステートメントを追加することを考えていました。

import CSV

with open('COGNOS.csv', "rb") as f, open('New_COGNOS.csv', "wb") as w:
    #Open 2 CSV files. One to read and the other to save.
    CSV_raw = csv.reader(f)
    CSV_new = csv.writer(w)
    for row in CSV_raw:
        item_num = row[3].split(" ")[0]
        row.append(item_num)
        if row[0] == "All Materials (By Collection)": break
        CSV_new.writerow(row)

ただし、これは多くのリソースを浪費しているように見えます。CSVファイルを反復処理するときに最後の行をスキップするpythonianの方法はありますか?

4

2 に答える 2

18

入力イテレータの最後のエントリを除くすべてを返すジェネレータを作成できます。

def skip_last(iterator):
    prev = next(iterator)
    for item in iterator:
        yield prev
        prev = item

CSV_raw次に、リーダーオブジェクトをラップします。

for row in skip_last(CSV_raw):

ジェネレーターは基本的に最初のエントリを取得してからループを開始し、各反復で前のエントリを生成します。入力反復子が完了すると、まだ 1 行残っており、それは決して返されません。

n最後の要素をスキップできる一般的なバージョンは次のようになります。

from collections import deque
from itertools import islice

def skip_last_n(iterator, n=1):
    it = iter(iterator)
    prev = deque(islice(it, n), n)
    for item in it:
        yield prev.popleft()
        prev.append(item)
于 2013-05-30T21:56:59.507 に答える
1

一般化された「skip-n」ジェネレーター

from __future__ import print_function
from StringIO import StringIO
from itertools import tee
s = '''\
1
2
3
4
5
6
7
8
'''
def skip_last_n(iterator, n=1):
    a, b = tee(iterator)
    for x in xrange(n):
            next(a)
    for line in a:
            yield next(b)

i = StringIO(s)
for x in skip_last_n(i, 1):
    print(x, end='')
1
2
3
4
5
6
7

i = StringIO(s)
for x in skip_last_n(i, 3):
    print(x, end='')
1
2
3
4
5
于 2013-05-30T22:09:38.850 に答える