如果文本文件中的前10个字符匹配,则写入新文件



我一直在尝试创建基于日期拆分日志文件的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()

最新更新