在 Python 中找到一些文本后如何阅读某些行?
How to read certain lines after you find some text in Python?
我正在阅读一个巨大的文件,其中包含包含我需要的信息的文本块。找到该信息的唯一方法是搜索该信息的 "header" "text"
。这是一个简单的解决方案:
line1 = f.readline()
if "text" in line1:
print(":)")
但是,我需要接下来 14 行文本中的信息(具体来说,我需要找到 "text"
所在行之后的第 3、12、14 和 15 行)。目前我正在使用
line2 = f.readline()
line3 = f.readline()
...
line15 = f.readline()
但这似乎非常低效。有更简洁的方法吗?我还需要能够遍历它,找到 "text"
的每个实例以及后面的信息。非常感谢
尝试构建一个循环并计算你的行数。东西link这个
rl = []
with opne("your_file") as fd:
cnt = 25 #let's start outside required line number after text
for l in fd.readlines():
cnt += 1
if "text" in l: # "text" in your line
cnt = 0 # reset counter
elif cnt in [3,12,13,14,15]: # if counter is one of lines you want
rl.append(l) # record them
print rl
我通常使用一个 while
循环来处理这样的事情,其中嵌套了一个 for
循环:
with open(filename) as f_in:
while True:
line = f_in.readline().strip()
if not line:
break
if line == "text":
data = [f_in.readline().strip() for i in range(15) if i in [2, 11, 13, 14]]
这使您可以避免在处理文件之前加载整个文件,如果您的数据段之间可能有不需要加载的额外行尤其有用,但只有在没有这些行时才能正常工作重叠片段。
请注意,此代码将从行中去除前导和尾随空格。如果您只想删除尾随空格,您可以使用 rstrip()
代替。如果您想完全避免更改行,您可以尝试使用 startswith()
进行前缀匹配,或者只在您的条件中包含换行符。
如果您确定不会有任何重叠的部分,您可以使用类似的东西:
lineno = 0
needed = [3, 12, 14, 15] # This may need adjusting to allow for lineno running from 1
found_at = None
for line in open('filename.txt').readlines(): # This will read blocks of lines for speed
lineno += 1 # Human readable line numbers
if found_at:
if (lineno - found_at) in needed:
print(lineno, line)
elif (lineno - found_at) > max(needed):
found_at = None
elif text in line:
found_at = lineno
您也可以使用复杂的正则表达式,但可能不值得花时间构建一个,而且会不太清楚。
我正在阅读一个巨大的文件,其中包含包含我需要的信息的文本块。找到该信息的唯一方法是搜索该信息的 "header" "text"
。这是一个简单的解决方案:
line1 = f.readline()
if "text" in line1:
print(":)")
但是,我需要接下来 14 行文本中的信息(具体来说,我需要找到 "text"
所在行之后的第 3、12、14 和 15 行)。目前我正在使用
line2 = f.readline()
line3 = f.readline()
...
line15 = f.readline()
但这似乎非常低效。有更简洁的方法吗?我还需要能够遍历它,找到 "text"
的每个实例以及后面的信息。非常感谢
尝试构建一个循环并计算你的行数。东西link这个
rl = []
with opne("your_file") as fd:
cnt = 25 #let's start outside required line number after text
for l in fd.readlines():
cnt += 1
if "text" in l: # "text" in your line
cnt = 0 # reset counter
elif cnt in [3,12,13,14,15]: # if counter is one of lines you want
rl.append(l) # record them
print rl
我通常使用一个 while
循环来处理这样的事情,其中嵌套了一个 for
循环:
with open(filename) as f_in:
while True:
line = f_in.readline().strip()
if not line:
break
if line == "text":
data = [f_in.readline().strip() for i in range(15) if i in [2, 11, 13, 14]]
这使您可以避免在处理文件之前加载整个文件,如果您的数据段之间可能有不需要加载的额外行尤其有用,但只有在没有这些行时才能正常工作重叠片段。
请注意,此代码将从行中去除前导和尾随空格。如果您只想删除尾随空格,您可以使用 rstrip()
代替。如果您想完全避免更改行,您可以尝试使用 startswith()
进行前缀匹配,或者只在您的条件中包含换行符。
如果您确定不会有任何重叠的部分,您可以使用类似的东西:
lineno = 0
needed = [3, 12, 14, 15] # This may need adjusting to allow for lineno running from 1
found_at = None
for line in open('filename.txt').readlines(): # This will read blocks of lines for speed
lineno += 1 # Human readable line numbers
if found_at:
if (lineno - found_at) in needed:
print(lineno, line)
elif (lineno - found_at) > max(needed):
found_at = None
elif text in line:
found_at = lineno
您也可以使用复杂的正则表达式,但可能不值得花时间构建一个,而且会不太清楚。