Python 匹配图案并选择文件中的特定行
我有一个文本文件显示在下面。我只想在Class 10块下选择2条线(线1和线2)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
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]