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

时间:2013-09-17 21:45:27

标签: python regex text file-io

我保留了技术说明的日记文件。每个条目的时间戳都是这样的:

# 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.

想要根据时间戳标题将这些注释分解为单个文件。例如This is a sample note.txtHere is another really long title.txt。我确定我必须在某个时候截断文件名,但想法是根据日记条目的第一行播种文件名。

看起来我不能通过python修改文件的创建日期,所以我想保留条目时间戳作为笔记正文的一部分。

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

#(\s)(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday)(\s)(.*)

并且可能使用该正则表达式循环遍历文件并中断每个条目,但我不太确定如何遍历日记文件并将其分解为单个文件。有很多抓住实际正则表达式模式或特定行的例子,但是我想在这里做更多的事情并且在将它们拼凑在一起时遇到一些困难。

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

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$

3 个答案:

答案 0 :(得分:5)

这是一般的;-)方法:

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()来转储目前已有的内容,并清除该列表。该文件的最后一个块是一个特殊情况,因为你不会再找到你的魔法正则表达式。所以你再次转储循环后的内容。

您可以在write_one()功能中进行任何您喜欢的转换。例如,您想要从输入时间戳行中删除前导“#”。那很好 - 只是做,例如,

body[0] = body[0][2:]
write_one中的

。所有的行都可以通过例如

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

您可能想要先检查该文件是否存在!如果它像我的日记一样,许多参赛作品的第一行将是“烂天”。 ; - )

答案 1 :(得分:1)

它确实不需要像你想象的那样多的正则表达式。

首先加载文件,以便根据新行添加文件:

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

现在只需循环播放!将每一行与您提供的正则表达式进行比较,如果匹配,则表示这是一个新的日期!

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

然后继续操作并在该特定文件名中写入行,直到您为正则表达式打到另一个匹配项,您知道它现在是一个新文件。这是逻辑循环:

for line in lines:
    m = re.match(your regex)
    if m:
        new_file = True
    else:
        new_file = False
    #now you will know when it's a new entry so you can easily do the rest

如果您需要更多逻辑分解,请告诉我。希望这很有帮助

答案 2 :(得分:1)

您在问题中设置了“批处理文件”标记,因此我编写了批处理文件.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="
      )
   )
)

例如:

C:\Users\Antonio\Documents\test
>dir /B
input.txt
test.bat

C:\Users\Antonio\Documents\test
>test

C:\Users\Antonio\Documents\test
>dir /B
Here is another one.txt
input.txt
test.bat
This is a sample note.txt

C:\Users\Antonio\Documents\test
>type "Here is another one.txt"
# 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.

C:\Users\Antonio\Documents\test
>type "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.