Python 解析格式不良的日志文件,其中记录是多行的,没有行集

Python 解析格式不良的日志文件,其中记录是多行的,没有行集,python,csv,text-parsing,Python,Csv,Text Parsing,我需要解析一堆巨大的文本文件,每个都是100MB+。它们是CSV格式的格式很差的日志文件,但每个记录都有多行,所以我不能只读取每行并用分隔符分隔它们。它也不是一个固定的行数,因为如果有空值,那么有时会跳过该行,或者一些行溢出到下一行。记录分隔符也可以在同一个文件中更改,从“”更改为“****”,有时会有一行写着“日志结束” 示例日志: "Date:","6/23/2015","","Location:","Kol","","Target Name:","ILO.sed.908" "ID:","k

我需要解析一堆巨大的文本文件,每个都是100MB+。它们是CSV格式的格式很差的日志文件,但每个记录都有多行,所以我不能只读取每行并用分隔符分隔它们。它也不是一个固定的行数,因为如果有空值,那么有时会跳过该行,或者一些行溢出到下一行。记录分隔符也可以在同一个文件中更改,从“”更改为“****”,有时会有一行写着“日志结束”

示例日志:

"Date:","6/23/2015","","Location:","Kol","","Target Name:","ILO.sed.908"
"ID:","ke.lo.213"
"User:","EDU\namo"
"Done:","Edit File"
"Comment","File saved successfully"
""
"Date:","6/27/2015","","Location:","Los Angeles","","Target Name:","MAL.21.ol.lil"
"ID:","uf.903.124.56"
"Done:","dirt emptied and driven to locations without issue, yet to do anyt"
"hing with the steel pipes, no planks "
"Comment"," l"
""
"end of log 1"
"Date:","5/16/2015","","Location:","Springfield","","Target Name:","ile.s.ol.le"
"ID:","84l.df.345"
"User:","EDU\bob2"
"Done:","emptied successfully"
"Comment","File saved successfully"
" ******* "
我应该如何处理这个问题?它需要有效率,以便我可以快速处理它,所以更少的文件io操作将是很好的。我目前只是一次将其读入内存:

with open('Path/to/file', 'r') as content_file:
    content = content_file.read()
我对python也有点陌生,我知道如何读取多个文件并在每个文件上运行代码,我有一个toString将其输出到一个新的csv文件中

另一个问题是,一些日志文件的大小只有几GB,一次将这些文件读入内存是不行的,但我不知道如何将它们分成块。我不能只读取X行数,因为没有设置记录行数

注释需要保存并连接在一个字符串中


所以请帮忙

我注意到每个日志条目都以“日期”行开始,以“完成”结束,然后是“注释”行。因此,不用担心分隔符,你可以从“日期”线到“注释”行读取所有内容,并将其视为日志的一个块。

“日志结束”消息似乎并不重要,但如果您真的想抓住它,您可以抓住两个连续的“日期”行之间的所有内容,这将是一个日志块


我在上面发布了一个链接,介绍了如何将文件分块加载。块越大,所需的I/O就越少,但这也意味着由于加载的块越大,内存会受到影响。

要处理大文件,您应该使用以下事实,即文件是Python中逐行返回的迭代器:

with open('Path/to/file', 'r') as content_file:
    for line in content_file:
         # your code

也使用此功能。lib可能很有用。

如何以块形式读取大型文件的示例: