Python 如果文本文件中的前10个字符匹配-写入新文件
我一直在尝试创建python脚本,根据日期分割日志文件,但我需要一些建议,因为我的经验有限,而且我还没有找到任何可以帮助我的文章 这是我的日志文件的一个示例:Python 如果文本文件中的前10个字符匹配-写入新文件,python,python-3.x,Python,Python 3.x,我一直在尝试创建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
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()
谢谢您的回答。如果文件不存在,则具有“a”(仅附加)访问模式的
打开功能将创建该文件;如果文件存在,则将其打开,然后在所有现有行之后写入该行。这会将所有匹配的日期放入相应的文件中
f = open("textfile.txt")
lines = f.readlines()
for line in lines:
print (line)
f2 = open(line[:10] + ".txt", "a")
f2.write(line)
f2.close()
使用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'
代表追加模式(每次向文件添加新行,而不是覆盖旧数据)。因此,如果您在不清除文件的情况下运行它两次,您将复制输出。这对于强大的用户来说是一项很好的工作。它可以用于根据某些属性分割序列,在本例中是前10个字符
如果您的日志文件名为my_log\u 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]
在这个例子中,你能说明期望的结果是什么吗?据我所知,任何一行的前10个字符都与示例中的前一行不匹配,因此我不清楚您的目标是什么。我已在帖子中更新了日志文件。这里前10个字符匹配。对于每一行之间的新日期,它应该创建一个文件,并将所有具有该日期的行添加到一个文件中。问题是什么?你在为哪一部分苦苦挣扎?谢谢,我会将此作为备选方案保存,但我已经用一个更简单的答案得到了我所需要的,并且没有导入库。比其他结果快得多。几乎可以立即正确地分割线。谢谢