我一直在尝试创建基于日期拆分日志文件的python脚本,但我需要一些建议,因为我的经验有限,我还没有找到任何可以帮助我的文章。
这是我的日志文件示例:
2020-01-27 23:01:12: RANDOMTEXT
2020-01-27 23:02:12: RANDOMTEXT
2020-01-27 23:03:12: RANDOMTEXT
2020-01-27 23:04:12: RANDOMTEXT
2020-01-27 23:05:12: RANDOMTEXT
2020-01-28 05:06:01: RANDOMTEXT
2020-01-28 05:07:01: RANDOMTEXT
2020-01-28 05:08:01: RANDOMTEXT
2020-01-28 05:09:01: RANDOMTEXT
2020-01-28 05:10:01: RANDOMTEXT
2020-01-30 05:11:01: RANDOMTEXT
2020-01-31 23:12:12: RANDOMTEXT
2020-01-31 23:13:12: RANDOMTEXT
2020-01-31 23:14:12: RANDOMTEXT
2020-01-32 05:15:01: RANDOMTEXT
2020-01-33 23:16:12: RANDOMTEXT
2020-01-33 23:00:12: RANDOMTEXT
2020-01-33 23:00:12: RANDOMTEXT
2020-01-33 23:00:12: RANDOMTEXT
2020-01-34 05:00:01: RANDOMTEXT
2020-01-34 05:00:01: RANDOMTEXT
我的想法是创建一个while循环和一个for循环,循环文本文件中的每一行,并检查前一行是否有相同的前10个字符。如果日期匹配,则应将文本行写入文本文件。一旦日期不匹配,它应该使用添加到文件中的日期名称创建一个新文件。
这就是我目前所拥有的:
f = open("textfile.txt")
lines = f.readlines()
linesingle = f.readline()
for line in lines:
print (line)
if "2020-01-28 " in line:
print("EXISTS")
编辑
Mattia Peracchi的回答为我提供了所需的简单解决方案,并添加了一些最后的代码。只需取前10个字符,并将这些行放入一个文本文件中,该文件由相同的10个第一个字符生成。
我只是手动输入第一行代码的日期。我可以很容易地添加一个变量,但这可以很好地满足我的需要。
最后的所有代码:
f = open("tekstfile.log", "r",encoding="utf8")
global prev_line
prev_line = '2020-01-27' #at least 10 char to avoid IndexError
for line in f.readlines():
if line[:10] == prev_line[:10]:
f2 = open(prev_line[:10], "a", encoding="utf8")
f2.write(line)
f2.close()
prev_line = line
f.close()
谢谢你的回答。
这对强大的itertools.groupby
来说是一项不错的工作。它可以用于根据某些属性拆分序列,在本例中为前10个字符。
如果您的日志文件名为my_log_file.log
,并且您想写入名为例如2020-01-27.log
的文件,则可以执行
from itertools import groupby
with open("my_log_file.log") as f:
for i, j in groupby(f, key=lambda x: x[:10]):
# i is the name of the group e.g. "2020-01-27"
with open(f'{i}.log', 'w') as outf:
for line in j:
outf.write(line)
这将为您提供等文件
# 2020-01-27.log
2020-01-27 23:01:12: RANDOMTEXT
2020-01-27 23:02:12: RANDOMTEXT
2020-01-27 23:03:12: RANDOMTEXT
2020-01-27 23:04:12: RANDOMTEXT
2020-01-27 23:05:12: RANDOMTEXT
我觉得我把这件事变得不必要地复杂,但现在是:
log = open('log.txt','r+')
line = log.readline()
i = 0
first_ten = line[:10]
while line: #will stop once it has gone through all lines
a = open(f'{first_ten}.txt','a+')
while line[:10] == first_ten: #as long as lines with same first 10 characters are being read,
a.write(line)
line = log.readline() #go to next line and write again if same first ten
a.close()
first_ten = line[:10]
使用for循环是个好主意,不需要while循环:
with open("textfile.txt") as f:
lines = f.readlines()
# initialise variables using data in the first line
current_date = lines[0][:10]
f = open(current_date + ".txt", 'a')
for line in lines:
# check the date
date = line[:10]
# if it's the not same date as on the previous line,
# close the file, open a new one, and overwrite the current_date variable
if date != current_date:
f.close()
f = open(date + ".txt", 'a')
current_date = date
f.write(line + 'n') # write with a new line character
f.close()
注意,'a'
代表附加模式(每次向文件中添加一行新行,而不是覆盖旧数据(。因此,如果您在不清除文件的情况下运行它两次,您将复制输出。
具有"a"(仅追加(访问模式的open
函数将在文件不存在的情况下创建该文件,如果存在则打开该文件,然后在所有现有行之后写入该行。这会将所有匹配的日期放入相应的文件中。
f = open("textfile.txt")
lines = f.readlines()
for line in lines:
print (line)
f2 = open(line[:10] + ".txt", "a")
f2.write(line)
f2.close()