高效地解析datetimes的文本文件

2024-09-30 23:33:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我的文本文件看起来像

<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

我需要抓取两个日期时间之间日志中的所有信息。目前,我做了一个datetime对象从每两次我之间的搜索。你知道吗

然后我逐行读取文件,并创建一个新的datetime对象,将其与开始时间和结束时间进行比较,以确定是否应该获取该行信息。然而,文件是巨大的(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天的数据。你知道吗


Tags: 文件to信息datetimeifinformationline时间
1条回答
网友
1楼 · 发布于 2024-09-30 23:33:11

您正在将所有文件读入内存,不管怎样,只需迭代文件对象,并在日期超出上限时中断:

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行超过上限,那么您的内存中仍然有所有行,您还可以拆分这些行,以便创建所有行的完整列表。你知道吗

您还可以检查月份/年份是否正确,并且只有在月份/年份正确的情况下才能创建datetime对象,这样会更快。你知道吗

如果你的台词是从上面开始的:

Jun/11 

您想要的是6月11日,然后简单地if line.startswith("Jun/11"),然后才开始创建datetime对象。你知道吗

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

相关问题 更多 >