Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中迭代时跳过CSV文件的最后一行_Python_Csv - Fatal编程技术网

在Python中迭代时跳过CSV文件的最后一行

在Python中迭代时跳过CSV文件的最后一行,python,csv,Python,Csv,我正在使用从数据仓库(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 sav

我正在使用从数据仓库(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)
广义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

如果你在ninx上,你可以使用
head-n-1yourfile.csv
在没有最后一行的情况下回显文件你是说unix lke OS吗?不幸的是,我正在使用我的公司电脑。不过谢谢你,当我在家里弄脏我的手时,它会派上用场的。Martijn,似乎在你的帐户后面有一个python开发团队:)生成如此快速准确的答案看起来太棒了!谢谢你,玛蒂金。这是惊人的快。代码也很有魅力。除此之外,必须删除“prev=next(迭代器):”结尾的“:”。我们开始吧!非常感谢。我也正是这样想的。一般来说,当您想要“向前看”时,通常更容易将问题更改为“向后看”。使用
tee
作为
n
大小的缓冲区也是一个好主意。使用
itertools.islice()
快速跳过
n
项,而不是在xrange(n)循环中为x使用
:下一步(islice(a,n,n),None)
消耗C代码中的
n
项,这将在
循环中随时击败
。@MartijnPieters,很好。出于可读性原因,我倾向于保留for循环。您的评论应该能够让每个人都看到更高效的
islice
选项!如果你感兴趣的话,这是我们的一部分。