AWK 到 Python 对于 Mbox
AWK to Python For Mbox
在 python 中实现此 awk 命令的最佳 Pythonic 方式是什么?
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 中实现它,并且如果它被打断也能够恢复进度。现在正在处理这个问题。
我正在绞尽脑汁!干杯!
你的递归方法注定要失败:你可能会一次打开太多文件,因为 with
块直到程序结束才会退出。
最好打开一个句柄并写入,遇到 "From" 时关闭并重新打开新句柄。
也可以在写入模式下打开您的文件,而不是追加。下面的代码尝试进行最少的操作和测试,以将每一行写入一个文件,并在找到 From:
时 close/open 另一个文件。还有,最后,最后一个文件被关闭了。
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
文件中。
在 python 中实现此 awk 命令的最佳 Pythonic 方式是什么?
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 中实现它,并且如果它被打断也能够恢复进度。现在正在处理这个问题。
我正在绞尽脑汁!干杯!
你的递归方法注定要失败:你可能会一次打开太多文件,因为 with
块直到程序结束才会退出。
最好打开一个句柄并写入,遇到 "From" 时关闭并重新打开新句柄。
也可以在写入模式下打开您的文件,而不是追加。下面的代码尝试进行最少的操作和测试,以将每一行写入一个文件,并在找到 From:
时 close/open 另一个文件。还有,最后,最后一个文件被关闭了。
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
文件中。