2017-08-25 54 views
2

我有一个包含大量数据的文本文件,它看起来是这样的:Python的解析文本文件的仅特定部分

logstart . . . 
(chunk of data) 
logend . . . 
logstart . . . 
(chunk of data) 
logend . . . 
times 
logstart . . . 
(chunk of data) 
logend . . . 
times 
logstart . . . 
(chunk of data) 
logend . . . 

我希望我的Python代码来打开文件和读取的数据块,如果和只有在它的“logend”下面有与它相关的“时间”。如果这个块没有时间,我希望它忽略它。当它读取正确的数据块时,我也希望它读取与之相关的时间。

这是我有什么之前,我意识到我需要提取仅某些部分(其中保存整个文本文件作为“行”):我怎样才能改变这种做法,

lines = [] 
with open(filename, 'rt') as in_file: 
    for line in in_file: 
     lines.append(line) 

“线”现在只是文件的特定部分?

+1

使用正则表达式似乎与're.findall'一起显示。 – FabienP

+1

请发布更多信息。日志块样本以及您想要捕获的内容将有所帮助。 – Solaxun

+0

我正在使用正则表达式来提取我需要的大块数据内的特定数据(因为我只需要它的一部分)。但是我目前的问题是让它只将我的代码的其余部分应用于文件的具有与其关联的特定部分的数据。 –

回答

2

事情是这样的:

lines = [] 
with open(filename, 'rt') as in_file: 
    chunk = [] 
    for line in in_file: 
     chunk.append(line) 
     if(line.find('times')>=0): 
      lines.extend(chunk) 
     if(line.find('logstart')>=0): 
      chunk = [] 
+0

该解决方案还包含'times','logstart'和'logend'行。 OP不清楚他们是否想要这样做。 – tdube

+0

另外,您需要使用'True'和'False'。 – tdube

+0

是的,如果它包含这些行是好的,因为我后来在做正则表达式。但是,这种解决方案不适合我 - 我得到一个AttributeError:'str'对象没有属性'contains' –

0

您可以通过保持一个小国家的轨道做到这一点。

lines = [] 
with open(filename, 'rt') as in_file: 
    in_log = False 
    save = [] 
    for line in in_file: 
     if 'logend' in line: 
      in_log = False 
     if in_log: 
      save.append(line) 
     if 'times' in line: 
      save.append(line) 
      lines.extend(save) 
     elif 'logstart' in line: 
      in_log = True 
      save = [] 
+0

谢谢,尽管我遇到了一些问题 - 我认为这段代码挑出了低于“时间”的数据块,但我只想要那些位于“时间”以上的数据块。我也想让自己的“时代”也展现出来。 –

+0

@WynneT根据您的反馈更新回答。 – tdube