我有看起来像这样的文本文件
<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