读取文件时如何跳过N条中心线?
How to skip N central lines when reading file?
我有这样的输入file.txt:
3
2
A
4
7
B
1
9
5
2
0
我正在尝试读取文件并且
- 当找到
A
时,打印下面2行的行
- 当找到
B
时,打印下面第4行
我当前的代码和当前输出如下:
with open('file.txt') as f:
for line in f:
if 'A' in line: ### Skip 2 lines!
f.readline() ### Skipping one line
line = f.readline() ### Locate on the line I want
print(line)
if 'B' in line: ## Skip 4 lines
f.readline() ### Skipping one line
f.readline() ### Skipping two lines
f.readline() ### Skipping three lines
line = f.readline() ### Locate on the line I want
print(line)
'4\n'
7
'1\n'
'9\n'
'5\n'
2
>>>
正在打印我想要的值,但也正在打印 4\n,1\n...
,除此之外,我还需要写几个 f.realines()
这是不实用的。
有更好的方法吗?
我的预期输出是这样的:
7
2
如果你不喜欢重复 readline
然后将它包装在一个函数中,这样其余的代码就非常干净了:
def skip_ahead(it, elems):
assert elems >= 1, "can only skip positive integer number of elements"
for i in range(elems):
value = next(it)
return value
with open('file.txt') as f:
for line in f:
if 'A' in line:
line = skip_ahead(f, 2)
print(line)
if 'B' in line:
line = skip_ahead(f, 4)
print(line)
至于额外输出,当您提供的代码在标准 python 解释器中是 运行 时,只有 print
语句会导致输出,因此没有额外的行,例如'1\n'
,这是某些上下文的特征,例如 IPython shell 当在语句上下文中找到表达式时,在这种情况下 f.readline()
单独在它自己的行上,所以它被检测为可能具有可能有趣的值。要抑制这种情况,您可以经常执行 _ = <expr>
来抑制输出。
这里有一个更简单的代码:
lines=open("file.txt","r").read().splitlines()
#print(str(lines))
for i in range(len(lines)):
if 'A' in lines[i]:
print(lines[I+2]) # show 2 lines down
elif 'B' in lines[i]:
print(lines[I+4]) # show 4 lines down
这会将整个文件读取为一个数组,其中每个元素都是文件的一行。然后它只是遍历数组并在找到它正在查找的行时直接将索引更改为 2(对于 A)和 4(对于 B)。
我有这样的输入file.txt:
3
2
A
4
7
B
1
9
5
2
0
我正在尝试读取文件并且
- 当找到
A
时,打印下面2行的行 - 当找到
B
时,打印下面第4行
我当前的代码和当前输出如下:
with open('file.txt') as f:
for line in f:
if 'A' in line: ### Skip 2 lines!
f.readline() ### Skipping one line
line = f.readline() ### Locate on the line I want
print(line)
if 'B' in line: ## Skip 4 lines
f.readline() ### Skipping one line
f.readline() ### Skipping two lines
f.readline() ### Skipping three lines
line = f.readline() ### Locate on the line I want
print(line)
'4\n'
7
'1\n'
'9\n'
'5\n'
2
>>>
正在打印我想要的值,但也正在打印 4\n,1\n...
,除此之外,我还需要写几个 f.realines()
这是不实用的。
有更好的方法吗?
我的预期输出是这样的:
7
2
如果你不喜欢重复 readline
然后将它包装在一个函数中,这样其余的代码就非常干净了:
def skip_ahead(it, elems):
assert elems >= 1, "can only skip positive integer number of elements"
for i in range(elems):
value = next(it)
return value
with open('file.txt') as f:
for line in f:
if 'A' in line:
line = skip_ahead(f, 2)
print(line)
if 'B' in line:
line = skip_ahead(f, 4)
print(line)
至于额外输出,当您提供的代码在标准 python 解释器中是 运行 时,只有 print
语句会导致输出,因此没有额外的行,例如'1\n'
,这是某些上下文的特征,例如 IPython shell 当在语句上下文中找到表达式时,在这种情况下 f.readline()
单独在它自己的行上,所以它被检测为可能具有可能有趣的值。要抑制这种情况,您可以经常执行 _ = <expr>
来抑制输出。
这里有一个更简单的代码:
lines=open("file.txt","r").read().splitlines()
#print(str(lines))
for i in range(len(lines)):
if 'A' in lines[i]:
print(lines[I+2]) # show 2 lines down
elif 'B' in lines[i]:
print(lines[I+4]) # show 4 lines down
这会将整个文件读取为一个数组,其中每个元素都是文件的一行。然后它只是遍历数组并在找到它正在查找的行时直接将索引更改为 2(对于 A)和 4(对于 B)。