我是一名业余爱好者,现在使用Python打开和关闭一段时间。很抱歉,如果这是一个愚蠢的问题,但我想知道如果输入文件中的格式是这样的话,是否有人知道如何轻松获取一堆行:
” 标题1
第1行
第2行
第3行
标题2
第1行
第2行
第3行 “
我不知道每个标题后有多少行,但我想抓住它们。我所知道的只是标题的名称或正则表达式模式。
我知道读取文件的唯一方法是“for file in file:”方式,但我不知道如何抓住我当前所在行之后的行。希望这是有道理的,谢谢你的帮助!
*感谢所有回复!我试图实现一些解决方案,但我的问题是并非所有标题都是相同的名称,我不知道如何解决它。我需要为每个提出不同的正则表达式...任何建议? *
答案 0 :(得分:7)
生成器功能
def group_by_heading( some_source ):
buffer= []
for line in some_source:
if line.startswith( "Heading" ):
if buffer: yield buffer
buffer= [ line ]
else:
buffer.append( line )
yield buffer
with open( "some_file", "r" ) as source:
for heading_and_lines in group_by_heading( source ):
heading= heading_and_lines[0]
lines= heading_and_lines[1:]
# process away.
答案 1 :(得分:4)
您可以使用变量标记当前正在跟踪的标题的位置,如果已设置,请抓住每一行,直到找到另一个标题:
data = {}
for line in file:
line = line.strip()
if not line: continue
if line.startswith('Heading '):
if line not in data: data[line] = []
heading = line
continue
data[heading].append(line)
这是一个http://codepad.org代码段,展示了它的工作原理:http://codepad.org/KA8zGS9E
编辑:如果您不关心实际的标题值,只想在最后找到一个列表,则可以使用:
data = []
for line in file:
line = line.strip()
if not line: continue
if line.startswith('Heading '):
continue
data.append(line)
基本上,您不需要跟踪标题的变量,而只需过滤掉与标题模式匹配的所有行。
答案 2 :(得分:1)
除了生成器之外,我认为我们可以创建一个dict,其中键是“Heading”,值是一个保存行的列表。这是代码
odd_map = {}
odd_list = []
with open(file, 'r') as myFile:
lines = myFile.readlines()
for line in lines:
if "Heading" in line:
odd_list = []
odd_map[line.strip()] = odd_list
else:
odd_list.append(line.strip())
for company, odds in odd_map.items():
print(company)
for odd in odds:
print(odd)
答案 3 :(得分:-1)
我不太了解Python,但这里有点伪代码。
int header_found = 0;
[从你在文件行中循环的循环开始]
如果(header_found == 1) [抢线]; header_found = 0;
if(line =〜/ [regexp for header] /) header_found = 1;
我们的想法是拥有一个变量来跟踪您是否找到了标题,如果有,还可以抓住下一行。