AWK到Mbox的Python

时间:2019-03-29 21:56:07

标签: python awk mbox

在python中实现此awk命令的最佳Python方式是什么?

awk 'BEGIN{chunk=0} /^From /{msgs++;if(msgs==500){msgs=0;chunk++}}{print > "chunk_" chunk ".txt"}' mbox

我现在正在使用它来拆分大量的邮箱(mbox格式)文件。

我正在尝试一种递归方法。

def chunkUp(mbox, chunk=0):
    with open(mbox, 'r') as bigfile:
        msg = 0
        for line in bigfile:
            if msg == 0: 
                with open("./TestChunks/chunks/chunk_"+str(chunk)+".txt", "a+") as cf:
                    if line.startswith("From "): msg += 1
                    cf.write(line)
                    if msg > 20: chunkUp(mbox, chunk+1)

我希望能够在python中实现此功能,并在中断时能够恢复进度。现在就开始工作。

我正在把我的大脑打结!干杯!

1 个答案:

答案 0 :(得分:0)

您的递归方法注定要失败:您可能最终一次拥有太多打开的文件,因为with块直到程序结束才退出。

最好打开并写入一个句柄,遇到“发件人”时关闭并重新打开新句柄。

还要以写入模式(而不是追加)打开文件。下面的代码尝试执行最少的操作和测试,以将每行写入文件,并在找到From:时关闭/打开另一个文件。同样,最后,最后一个文件也关闭了。

def chunkUp(mbox):
    with open(mbox, 'r') as bigfile:
        handle = None
        chunk = 0

        for line in bigfile:
            if line.startswith("From "):
                 # next (or first) file
                 chunk += 1
                 if handle is not None:
                    handle.close()
                 handle = None

            # file was closed / first file: create a new one
            if handle is None:
               handle = open("./TestChunks/chunks/chunk_{}.txt".format(chunk), "w")
            # write the line in the current file
            handle.write(line)

         if handle is not None:
             handle.close()

我还没有测试过,但是它很简单,应该可以使用。如果文件的第一行中没有“发件人”,则之前的所有行都存储在chunk_0.txt文件中。