Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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
File 如何从行号边界内的文本文件中提取文本?_File_Parsing_Text_Python - Fatal编程技术网

File 如何从行号边界内的文本文件中提取文本?

File 如何从行号边界内的文本文件中提取文本?,file,parsing,text,python,File,Parsing,Text,Python,我正在尝试从文本文件中获取数据。文本文件中感兴趣的行是那些一直匹配“Marker 2”的行,直到“Marker 3”的最后一个实例。可以有多个标记(重复)。我想要“Marker 2”的最小行号和“Marker 3”的最大行号,这是该最小/最大值中的所有文本。虽然这是可行的,但我想看看如何以pythonic的方式实现这一点,更高效,更少的代码 为什么我必须打开同一个文件两次?它给了我另一种感觉,xreadlines和readlines冲突 文件\u seeklines.py import sys

我正在尝试从文本文件中获取数据。文本文件中感兴趣的行是那些一直匹配“Marker 2”的行,直到“Marker 3”的最后一个实例。可以有多个标记(重复)。我想要“Marker 2”的最小行号和“Marker 3”的最大行号,这是该最小/最大值中的所有文本。虽然这是可行的,但我想看看如何以pythonic的方式实现这一点,更高效,更少的代码

为什么我必须打开同一个文件两次?它给了我另一种感觉,xreadlines和readlines冲突

文件\u seeklines.py

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”的最大出现。