在文件中的特定行之后找到包含时间戳的第一行

时间:2015-07-16 08:35:14

标签: python string search

我正在尝试从文件中为搜索结果添加时间戳。

我的代码是:

def findIcommingStats():
    #read the result file
    replication_file = open("result.log", "r")

    #create a new temp file for all the prints we will find
    tempFile = open("incomingTemp.txt", "w")

    #loop over the file and move all relevant lines to another temp file
    for line in replication_file:
            if ((line.find('STATISTICS') >= 0) & ( line.find('DeltaMarkerIncomingData') > 0 ) & ( line.find('Counter') == -1  ) &
                     ( line.find('0.00e+00') == -1 ) & ( line.find('0.00') == -1 ) & ( line.find('description') == -1 ) ):
                            tempFile.write(line)
    #cleanup
    replication_file.close()
    tempFile.close()

这给了我在我的文件中搜索的字符串,如下所示: “统计:name = gridDeltaMarkerIncomingData kVolSlot = 0 GroupCopy(26764 SiteUID(0x3d1d0445)0)0 8582秒窗口:速率:3.53e-06 MB /秒”

时间戳在此前约20-30行。 如何在字符串之前将它们打印成行?

时间戳看起来像“2015/07/08 10:08:00.079”

文件看起来像:

2015/07/08 10:14:46.971 - #2 - 4080/4064 - AccumulatorManager: ProcessID= RAW STATS:

<statistics>

STATISTICS: name=gridDeltaMarkerIncomingData kVolSlot=0 GroupCopy(26764 SiteUID(0x3d1d0445) 0) 0 924 sec window: Rate: 0.00e+00 MB/sec
STATISTICS: name=gridDeltaMarkerIncomingData kVolSlot=0 GroupCopy(26764 SiteUID(0x3d1d0445) 0) 0 8582 sec window: Rate: 3.53e-06 MB/sec
STATISTICS: name=gridDeltaMarkerIncomingData kVolSlot=0 GroupCopy(26764 SiteUID(0x3d1d0445) 0) 0 63612 sec window: Rate: 4.23e-06 MB/sec

<more statistics>

我想在RAW STATS行中获得该时间戳。所以它看起来像:

2015/07/08 10:14:46.971 STATISTICS: name=gridDeltaMarkerIncomingData kVolSlot=0 GroupCopy(26764 SiteUID(0x3d1d0445) 0) 0 924 sec window: Rate: 0.00e+00 MB/sec

2015/07/08 10:14:46.971 STATISTICS: name=gridDeltaMarkerIncomingData kVolSlot=0 GroupCopy(26764 SiteUID(0x3d1d0445) 0) 0 8582 sec window: Rate: 3.53e-06 MB/sec

2 个答案:

答案 0 :(得分:2)

基本上应该完成这项工作:

def stat_entry(line):
    return line.startswith('STATISTICS')

def date_entry(line):
    return line.startswith('20')

def findIcommingStats():
    date = ''
    with open("result.log", "r") as replication_file:
        with open("incomingTemp.txt", "w") as tempFile:
            for line in replication_file:
                if date_entry(line):
                    date = ' '.join(line.split(' ')[:2]) # set new date
                elif stat_entry(line):
                    tempFile.write(date  + ' ' + line) # write to tempfile

findIcommingStats()

输出:

2015/07/08 10:14:46.971 STATISTICS: name=gridDeltaMarkerIncomingData...
2015/07/08 10:14:46.971 STATISTICS: name=gridDeltaMarkerIncomingData...
2015/07/08 10:14:46.971 STATISTICS: name=gridDeltaMarkerIncomingData...

如您所见,我将stat_entrydate_entry函数排除在外;您可能想要更改这些并添加一些更好的标准来检查给定的行是日期还是统计条目。

答案 1 :(得分:1)

你可以使用正则表达式来完成这个和其他类似的问题。

首先你需要找到时间戳

 regexTimeStamp = re.complie('\d{4}\/\d{2}\/\d{2} \d{2}:\d{2}:\d{2}.\d{3}')

然后你可以使用

match = regexTimeStamp.match(Str)

这里我使用Str作为文件中的一行。 然后使用TimeStamp = match.group()来获取时间戳

现在simillarly使用正则表达式来查找

regexStat = re.compile('STATISTICS:')

match1 = regexStat.match(str)
match1.start()

将为您提供STATISTICS的起始索引: 你可以在那之前追加你的TimeStamp。

here is a guide on regex

and here is for hit and try