我有一个文件如下:
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中实现它呢?
答案 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)