我正在使用从数据仓库(Cognos)获得的CSV文件进行数据分析。 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文件时是否有任何pythonian方法可以跳过最后一行?
答案 0 :(得分: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):
生成器基本上接受第一个条目,然后开始循环,并在每次迭代时产生前一个条目。输入迭代器完成后,仍然有一行,永远不会返回。
允许您跳过上一个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)
答案 1 :(得分: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