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')