Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 匹配图案并选择文件中的特定行_Python - Fatal编程技术网

Python 匹配图案并选择文件中的特定行

Python 匹配图案并选择文件中的特定行,python,Python,我有一个文本文件显示在下面。我只想在Class 10块下选择2条线(线1和线2) Thu May 29 14:16:00 PDT 2014 Class 09 line 0 line 1 line 2 -- Class 10 line 0 line 1 line 2 -- Class 11 line 0 line 1 line 2 -- Thu May 29 14:20:00 PDT 2014 Class 09 line 0 line 1 line 2 -- Class 10 line 0 lin

我有一个文本文件显示在下面。我只想在Class 10块下选择2条线(线1和线2)

Thu May 29 14:16:00 PDT 2014
Class 09
line 0
line 1
line 2
--
Class 10
line 0
line 1
line 2
--
Class 11
line 0
line 1
line 2
--
Thu May 29 14:20:00 PDT 2014
Class 09
line 0
line 1
line 2
--
Class 10
line 0
line 1
line 2
--
Class 11
line 0
line 1
line 2
--
我尝试了以下操作,但
linecache
仅获取第1行。我想找到一种方法,先抓取第1行,然后抓取第2行。有什么想法吗? 谢谢

这一行计算文件中的行数,就这样。可能不是你想要的

不确定为什么需要
linecache
。而且您没有显示如何计算
开始
步骤
,这可能就是您的错误所在

您想要的可能是这样的:

def reading_function():
    searching = True
    linesToRead = 2
    with open('text.txt') as f:
        for line in f:
            if searching and line.strip() == "Class 10":
                searching = False
            elif not searching:
                print line.strip()
                linesToRead -= 1
                if linesToRead == 0:
                    return
只是玩玩而已

我认为你不应该需要旗帜和计数器的操作,只需要一些可爱的循环

lines_after_text = 2
search_text = "Class 10"
desired_lines = [] # in case search_text appears in text.txt more than once.
with open('text.txt') as f:
    for line in f:
        if search_text in line:
            desired_lines.extend([next(f) for i in range(lines_after_text)])
别忘了一个正则表达式

with open(fn) as f:
    for m in re.finditer(r'^(Class 10.*?)(?:^Class 11|\Z)', f.read(), re.M | re.S):
        print m.group(1).splitlines()[2:4]
印刷品:

['line 1', 'line 2']
['line 1', 'line 2']
如果文件大于内存中所需的大小,请使用内存映射:

import re
import mmap

with open(fn) as f:
    mm=mmap.mmap(f.fileno(),0,access=mmap.ACCESS_READ)
    for m in re.finditer(r'^(Class 10.*?)(?:^Class 11|\Z)', mm, re.M | re.S):
        print m.group(1).splitlines()[2:4]

什么是
linecache
?要计算
numOflines
,您已经在整个文件上循环了一次。你应该只需要对文件进行一次检查。我想是这样的:谢谢!我以前从没听说过。有趣的是…这是一个更大的文件还是一些适合内存的东西?我已经试过了。如果line:print(“输入了if”)中的“Class 10”所需的_行=[f.next()表示范围内的i(line\u之后的_文本)]打印(line)中断其他:打印,则它永远不会到达if块:line\u text=2之后,open('text.txt')作为f:for line in f:print(“if之前”)(“超出if语句”)在这里可以正常工作。您可能需要检查文件“text.txt”,以确保它实际包含预期的搜索文本。
['line 1', 'line 2']
['line 1', 'line 2']
import re
import mmap

with open(fn) as f:
    mm=mmap.mmap(f.fileno(),0,access=mmap.ACCESS_READ)
    for m in re.finditer(r'^(Class 10.*?)(?:^Class 11|\Z)', mm, re.M | re.S):
        print m.group(1).splitlines()[2:4]