我正在使用从数据仓库(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方式可以跳过最后一行?

最佳答案

您可以编写一个生成器,该生成器将返回输入迭代器中除最后一个条目之外的所有内容:

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)

关于python - 在Python中进行迭代时跳过CSV文件的最后一行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16846460/

10-13 04:41