2013-05-30 163 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)。 –

相关问题