使用Python将日志文件拆分为多个文件

2024-04-19 11:28:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有科技笔记的日记档案。每个条目的时间戳如下:

# Monday 02012-05-07 at 01:45:20 PM

This is a sample note

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

# Wednesday 02012-06-06 at 03:44:11 PM

Here is another one.

Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia 
deserunt mollit anim id est laborum.

希望根据时间戳头将这些注释分解成单独的文件。e、 g.This is a sample note.txtHere is another really long title.txt。我肯定我会在某个时候截断文件名,但是我的想法是根据日志条目的第一行来种子文件名。在

看起来我不能通过python修改文件的创建日期,所以我希望保留条目时间戳作为注释主体的一部分。在

我有一个RegEx模式来捕捉适合我的时间戳:

^{pr2}$

并且可以使用该正则表达式循环遍历文件并分解每个条目,但我不太确定如何循环遍历日志文件并将其分解为单独的文件。有很多获取实际regex模式或特定行的例子,但是我想在这里做更多的事情,并且在一起表达有一些困难。在

以下是所需文件内容的示例(日期戳+下一个日期戳匹配之前的所有文本):

bash$ cat This\ is\ a\ sample\ note.txt
Monday 02012-05-07 at 01:45:20 PM

This is a sample note

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

bash$

Tags: 文件sampleinis时间thisatnote
3条回答

它真的没有你想象的那么需要正则表达式。在

首先,只需加载文件,使其基于新行:

fl = 'file.txt'
with open(fl,'r') as f:
    lines = f.readlines()

现在就绕过去!将每一行与您提供的regex进行比较,如果匹配,则表示这是一个新日期!在

然后,您将获取下一个非空行,并将其设置为文件名。在

然后继续检查并向该特定文件名写入行,直到找到与正则表达式匹配的另一个匹配项,在那里您知道它现在应该是一个新文件。以下是逻辑回路:

^{pr2}$

如果你需要更多的逻辑分析,请告诉我。希望这是有帮助的

以下是一般方法;—)方法:

f = open("diaryfile", "r")
body = []
for line in f:
    if your_regexp.match(line):
        if body:
            write_one(body)
        body = []
    body.append(line)
if body:
    write_one(body)
f.close()

简而言之,您只需将所有行追加到列表(body)。当你找到一条神奇的线时,你可以调用write_one()来删除你目前所拥有的,并清除列表。文件的最后一块是一个特殊情况,因为你不会再找到你神奇的regexp了。所以你在循环之后再次丢弃你的东西。在

您可以在write_one()函数中进行任何您喜欢的转换。例如,听起来像是要从输入时间戳行中删除前导“#”。没关系-就这么做,例如

^{pr2}$

write_one中。所有的行都可以一口写出,例如

with open(file_name_extracted_from_body_goes_here, "w") as f:
    f.writelines(body)

你可能要先检查文件是否存在!如果它像我的日记,那么许多条目的第一行将是“烂日子”

您在问题中设置了“批处理文件”标记,因此我编写了一个批处理文件.bat解决方案。这里是:

@echo off
setlocal EnableDelayedExpansion

set daysOfWeek=/Monday/Tuesday/Wednesday/Thursday/Friday/Saturday/Sunday/

for /F "delims=" %%a in (input.txt) do (
   if not defined timeStamp (
      set timeStamp=%%a
   ) else if not defined fileName (
      set fileName=%%a
      (
      echo !timeStamp!
      echo/
      echo !fileName!
      echo/
      ) > "!fileName!.txt"
   ) else (
      for /F "tokens=2" %%b in ("%%a") do if "!daysOfWeek:/%%b/=!" equ "%daysOfWeek%" (
         echo %%a>> "!fileName!.txt"
      ) else (
         set timeStamp=%%a
         set "fileName="
      )
   )
)

例如:

^{pr2}$

相关问题 更多 >