首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从AWK到Python的Mbox

从AWK到Python的Mbox
EN

Stack Overflow用户
提问于 2019-03-29 21:56:07
回答 1查看 81关注 0票数 0

在python中实现这个awk命令的最好的Pythonic方法是什么?

代码语言:javascript
复制
awk 'BEGIN{chunk=0} /^From /{msgs++;if(msgs==500){msgs=0;chunk++}}{print > "chunk_" chunk ".txt"}' mbox

我现在用这个来分割巨大的邮箱(mbox格式)文件。

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

代码语言:javascript
复制
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中实现这一点,如果它被中断,我将能够恢复进度。现在正在做这件事。

我把我的大脑绑成了结!干杯!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-29 22:18:03

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

最好打开一个句柄并写入它,当遇到"From“时关闭并重新打开新句柄。

也可以在写模式下打开文件,而不是附加。下面的代码试图执行最小的操作&测试在文件中写入每一行,并在找到From:时关闭/打开另一个文件。最后,最后一个文件被关闭。

代码语言:javascript
复制
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()

我还没有测试过它,但它很简单,它应该能工作。如果文件在第一行中没有"From“,那么前面的所有行都存储在chunk_0.txt文件中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55425938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档