2013-05-30 155 views
4

我正在使用從datawarehouse(Cognos)獲取的CSV文件進行數據分析。 CSV文件的最後一行總結了上面所有的行,但我不需要這一行來進行分析,所以我想跳過最後一行。在Python中迭代時跳過CSV文件的最後一行

我在考慮添加「if」語句來檢查我的「for」循環中的列名稱,如下所示。

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文件時,有沒有python的方法可以跳過最後一行?

+0

如果你對ninx您可以用'頭 - n -1 yourfile.csv'到echo文件沒有最後一行 – dm03514

+0

你的意思是unix-lke操作系統?不幸的是,我正在使用我的公司電腦。不過謝謝你,當我在家裏弄髒我的手時,它會派上用場。 –

回答

15

你可以寫一個生成器,會在輸入迭代器返回的一切,但最後一個條目:

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

然後換你CSV_raw讀者對象在於:

for row in skip_last(CSV_raw): 

發電機基本上採用第一個入口,然後開始循環,每次迭代產生前一個入口。當輸入迭代器完成後,仍然有一行,這是永遠不會返回。

的通用版本,讓你跳過最後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) 
+0

+1可重複使用的發電機! –

+2

Martijn,好像你的賬戶後面有一個python開發團隊:)製作快速準確的答案看起來非常棒! – alecxe

+0

謝謝Martijin。這非常快。代碼也像魅力一樣。除「prev = next(iterator):」之外的「:」必須被刪除。 –

1

廣義 「跳過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 
+0

使用'tee'作爲'n'大小的緩衝區也是一個不錯的主意。使用'itertools.islice()'快速跳過'n'項,而不是'xrange(n)'循環中的'for x':next(islice(a,n,n),None)''消耗'n'項C代碼,它會隨時擊敗'for'循環。 –

+0

@MartijnPieters,好點。出於可讀性的原因,我傾向於將for循環留在原地。你的評論應該能夠指出每個人更高效的'islice'選項! – iruvar

+0

如果您有興趣,它是'itertools'文檔中的''使用'配方'的一部分(http://docs.python.org/2/library/itertools.html#recipes)。 –

相關問題