python - 有效解析文本文件的日期时间

标签 python performance python-2.7 parsing datetime

我有看起来像这样的文本文件

<Jun/11 09:14 pm>Information i need to capture1
<Jun/11 09:14 pm> Information i need to capture2

<Jun/11 09:14 pm> Information i need to capture3
<Jun/11 09:14 pm> Information i need to capture4
<Jun/11 09:15 pm> Information i need to capture5
<Jun/11 09:15 pm> Information i need to capture6

和两个日期时间,例如

15/6/2015-16:27:10  # startDateTime
15/6/2015-17:27:19  # endDateTime

我需要获取两个日期时间之间日志中的所有信息。目前,我从我搜索的两次时间中创建一个日期时间对象。

然后,我逐行读取文件并创建一个新的日期时间对象,将其与开始时间和结束时间进行比较,看看是否应该获取该行信息。然而,文件很大(150MB),并且代码可能需要几个小时才能运行(在 100 多个文件上)。

代码看起来像这样

f = open(fileToParse, "r")
for line in f.read().splitlines():
    if line.strip() == "":
        continue
    lineDateTime = datetime.datetime(lineYear, lineMonth, lineDay, lineHour, lineMin, lineSec)
    if (startDateTime < lineDateTime < endDateTime):
        writeFile.write(line+"\n")
        between = True
    elif(lineDateTime > endDateTime):
        writeFile.write(line+"\n")
        break
    else:
        if between:
            writeFile.write(line+"\n")

我想用更多的智慧来重写这个。这些文件可以保存数月的信息,但我通常只搜索大约 1 小时到 3 天的数据。

最佳答案

无论如何,您都将所有文件读入内存,只需迭代文件对象并在日期超出上限时中断:

with  open(fileToParse, "r") as f:
    for line in f:
        if not line.strip():
            continue
        lineDateTime = datetime.datetime(lineYear, lineMonth, lineDay, lineHour, lineMin, lineSec)
        if startDateTime < lineDateTime < endDateTime:
            writeFile.write(line + "\n")
        elif lineDateTime > endDateTime:
            break

显然你需要获取lineYear、lineMonth等..

使用 f.read().splitlines() 不仅将所有行读取到内存中,因此如果您中的 5 行高于上限,您仍然可以在内存中保留所有行,您还可以拆分行,以便您也创建所有行的完整列表。

您还可以检查月份/年份是否正确,并且只有在月份/年份正确的情况下才创建日期时间对象,这样会快得多。

如果您的行如上开头:

Jun/11 

您想要 Jun/11,然后只需 if line.startswith("Jun/11") 然后才开始创建日期时间对象。

with open(fileToParse, "r") as f:
    for line in f:
        if line.startswith("Jun/11"):
            for line in f:
                try:
                    lineDateTime = datetime.datetime...
                except ValueError:
                    continue
                if startDateTime < lineDateTime < endDateTime:
                    writeFile.write(line + "\n")
                elif lineDateTime > endDateTime:
                    break

关于python - 有效解析文本文件的日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30874773/

相关文章:

python - Tweepy 跟踪条款和关注用户

python - 为什么 numpy.sum 没有给我正确的结果?

html - 服务器路径性能(绝对链接与相对链接)

mysql - 使用 GROUP BY 查询会变慢

python - 如何在scrapy中使用spider从mysql获取数据并从web中提取数据

python - 合并两个数据帧,其中一个包含间隔数据

python - Maya python 反斜杠替换问题

r - 如何优化矩阵中行和列的交集?

python - 做字谜组的更好方法

python - 在Python中使某个语句永远循环