到达文件中的数字时,跳过多行

时间:2018-05-31 13:37:57

标签: 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的行数。在这里,当到达A 2时,我想跳过接下来的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.2 GB,所以我认为更高效的内存,逐行读取。我怎么能在Python中实现它呢?

3 个答案:

答案 0 :(得分:2)

只需跟踪逐行阅读时需要跳过的行数,如果是> 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

示例输入的输出:

A 1
A 1
A 1
A 2
A 3

A 2之后的2行和A 3之后的三行都被跳过。

答案 1 :(得分:2)

您可以将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')

答案 2 :(得分:0)

这样可以节省你的计算时间,大约快两倍:

skipper = 0

result = []

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