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

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

我一直在尝试创建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()

谢谢您的回答。

如果文件不存在,则具有“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个字符匹配。对于每一行之间的新日期,它应该创建一个文件,并将所有具有该日期的行添加到一个文件中。问题是什么?你在为哪一部分苦苦挣扎?谢谢,我会将此作为备选方案保存,但我已经用一个更简单的答案得到了我所需要的,并且没有导入库。比其他结果快得多。几乎可以立即正确地分割线。谢谢