在Python中找到一些文本后,如何阅读某些行?

时间:2018-07-13 17:23:06

标签: python readline

我正在阅读一个巨大的文件,其中包含我需要的信息。查找该信息的唯一方法是搜索该信息的“标题” "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"的每个实例以及随后的信息。非常感谢

3 个答案:

答案 0 :(得分:0)

我通常将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()进行前缀匹配,或者在条件中仅包含换行符。

答案 1 :(得分:0)

如果您确定不会有任何重叠的部分,则可以使用以下内容:

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

您也可以使用复杂的正则表达式,但可能不值得花时间构造一个正则表达式,而且不清楚得多。

答案 2 :(得分:-1)

尝试构建循环并计算行数。链接到此

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