Python 当到达文件中的某个数字时,跳过多行

Python 当到达文件中的某个数字时,跳过多行,python,csv,Python,Csv,我的档案如下: Col1 Col2 A 1 A 1 A 1 A 2 A 1 A 1 A 3 A 1 A 1 A 1 我想用Python逐行读取文件。当我到达Col2>1的行时,我想跳过等于Col2的行数。这里,当到达a2时,我想跳过接下来的2行,当到达Col2等于3时,我想跳过接下来的3行,依此类推 如果我在列表中读取整个文件,我可以执行以下操作: k = [1, 1, 1, 2, 1, 1, 3, 1, 1, 1] i = [] for element in k: if elemen

我的档案如下:

Col1 Col2
A 1
A 1
A 1
A 2
A 1
A 1
A 3
A 1
A 1
A 1
我想用Python逐行读取文件。当我到达Col2>1的行时,我想跳过等于Col2的行数。这里,当到达
a2
时,我想跳过接下来的2行,当到达Col2等于3时,我想跳过接下来的3行,依此类推

如果我在列表中读取整个文件,我可以执行以下操作:

k = [1, 1, 1, 2, 1, 1, 3, 1, 1, 1]
i = []
for element in k:
    if element > 1:
        h = k.index(element)
        i.append(h)
        for j in range(1,element+1):
            i.append(h+j)

new_list = []       
for d in range(1, len(k)+1):
    if not d in i:
        new_list.append(k[d-1])

但我的实际文件是7.2GB,所以我认为逐行读取会更节省内存。那么,我如何在Python中实现这一点呢?

只要跟踪在逐行阅读时需要跳过的行数,如果该值为
>0

with open('test.csv') as f:
  rd = csv.reader(f, delimiter=' ');next(rd) # skips header
  skip = 0
  for i, j in rd:
    if not skip:
      skip = 0 if int(j) < 2 else int(j)
      print(i, j)
    else:
      skip -= 1

a2
之后的两行和
a3
之后的三行都被跳过。

这将节省您的计算时间,速度大约是原来的两倍:

skipper = 0

result = []

for i in k:
    if i > 1:
        if not skipper:
            skipper = i
        else:
            skipper -= 1
    elif not skipper:
        result.append(i)

您可以将
csv
模块与生成器功能一起使用。然后在生成器中迭代项目

def gen_rows(file):
    with open(file, 'r') as fin:
        reader = csv.reader(mystr, delimiter=' ')
        headers = next(reader)

        for col1, col2 in reader:
            num = int(col2)
            if num > 1:
                for i in range(num):
                    next(reader)
            yield col1, col2

for i in gen_rows('file.csv'):
    print(i)

('A', '1')
('A', '1')
('A', '1')
('A', '2')
('A', '3')

谢谢请解释一下if not skip的代码好吗?
if not skip
只需检查
skip
是否等于0,如果等于0,则打印该行,否则跳过该行即可!我从来没有在同一行中写过if和else。所以,当你写了
skip=0,如果int(j)是正确的,很抱歉,还有一件事。在这里,似乎当
else int(j)
为真时,skip就等于int(j),对吗?如果是这样,为什么不是
或者skip=int(j)
def gen_rows(file):
    with open(file, 'r') as fin:
        reader = csv.reader(mystr, delimiter=' ')
        headers = next(reader)

        for col1, col2 in reader:
            num = int(col2)
            if num > 1:
                for i in range(num):
                    next(reader)
            yield col1, col2

for i in gen_rows('file.csv'):
    print(i)

('A', '1')
('A', '1')
('A', '1')
('A', '2')
('A', '3')