File 如何从行号边界内的文本文件中提取文本?
我正在尝试从文本文件中获取数据。文本文件中感兴趣的行是那些一直匹配“Marker 2”的行,直到“Marker 3”的最后一个实例。可以有多个标记(重复)。我想要“Marker 2”的最小行号和“Marker 3”的最大行号,这是该最小/最大值中的所有文本。虽然这是可行的,但我想看看如何以pythonic的方式实现这一点,更高效,更少的代码 为什么我必须打开同一个文件两次?它给了我另一种感觉,xreadlines和readlines冲突 文件\u seeklines.pyFile 如何从行号边界内的文本文件中提取文本?,file,parsing,text,python,File,Parsing,Text,Python,我正在尝试从文本文件中获取数据。文本文件中感兴趣的行是那些一直匹配“Marker 2”的行,直到“Marker 3”的最后一个实例。可以有多个标记(重复)。我想要“Marker 2”的最小行号和“Marker 3”的最大行号,这是该最小/最大值中的所有文本。虽然这是可行的,但我想看看如何以pythonic的方式实现这一点,更高效,更少的代码 为什么我必须打开同一个文件两次?它给了我另一种感觉,xreadlines和readlines冲突 文件\u seeklines.py import sys
import sys
filename = sys.argv[1]
line_number = []
number = 0
## Fetch the boundary(start, end points)
f = open(filename,'r')
for line in f.xreadlines():
number += 1
if "marker 2" in line.strip().lower():
line_number.append(number)
if "marker 3" in line.strip().lower():
line_number.append(number)
#print line_number[0], line_number[-1]
start, end = line_number[0]-1, line_number[-1]
f.close()
## Grab the boundary
g = open(filename,'r')
linelist = g.readlines()
try:
for i in xrange(start, end):
print linelist[i]
except:
print "failed"
pass
g.close()
file.txt
Welcome notice
------------------------
Hello there, welcome! Foo
Marker 0
hello
world
Bar
Yes!
Foo
How are ya?!
Bar
Have a great day!
Marker 1
Hello 1 2
12
MarKer 2
Hello 23
23
Marker 3
Hello 34
34
marker 2
Hello 45
45
MArker 3
MarKer 2
Hello 23
23
Marker 3
Hello 34
34
marker 2
Hello 45
45
MArker 3
输出
Welcome notice
------------------------
Hello there, welcome! Foo
Marker 0
hello
world
Bar
Yes!
Foo
How are ya?!
Bar
Have a great day!
Marker 1
Hello 1 2
12
MarKer 2
Hello 23
23
Marker 3
Hello 34
34
marker 2
Hello 45
45
MArker 3
MarKer 2
Hello 23
23
Marker 3
Hello 34
34
marker 2
Hello 45
45
MArker 3
不要使用readlines()
,而是使用read()
,这样您就不必迭代行了
然后,您可以使用split()
找到感兴趣的零件
例如
你不只是使用正则表达式有什么原因吗?i、 e.
(marker 2.*marker 3)
带有re.DOTALL
和re.IGNORECASE
标志。如果您的文件不太大,无法读取()
到内存中,您可以使用正则表达式方法(利用*
操作符贪婪的事实):
另一个选项是在两个方向上迭代行,分别在第一次出现“标记2”和“标记3”时停止:
with open(filename, 'r') as f:
lines = f.readlines
for i in range(len(lines)):
if "marker 2" in lines[i].lower():
start = i
break
else:
start = None
for i in range(len(lines), -1, -1):
if "marker 3" in lines[i].lower():
end = i
break
else:
end = None
if None not in (start, end):
inBetween = lines[start + 1:end]
else:
#one of the markers is missing, handle here.
顺便说一下,编写的代码从包含
标记2
或标记3
的最小行读取到包含标记2
或标记3
的最大行。当它执行min或max时,我从列表中获取min/max的边界。我想贪婪地抓取文本。AttributeError:“NoType”对象没有属性te“组”-它与pattern@ThinkCode:添加标志re.IGNORECASE
。尝试使用IGNORECASE,没有骰子。您的另一个解决方案是提供TypeError:type'builtin\u function\u或\u method'的对象没有len()错误。@ThinkCode:没问题。感谢您提醒我在发布答案之前测试答案:p这使它不贪婪(.*)如果有人在为我的问题寻找解决方案:inBetween=re.search(r“Marker 2(.*Marker 3)”,f.read(),re.S|re.I).group()只抓取最后一个匹配项。不返回边界。它现在给我整个文本文件。我正在仔细考虑。但问题只要求一个匹配项,对吗?应该是f.read().split(“Marker 2”),1)[1].rsplit(“标记3”,1)[0]
否,边界-(最小值,最大值)。最小值是“标记2”的第一次出现,最大值是“标记3”的最大出现。