gpt4 book ai didi

python - 从 Python 中打开的类文件对象解析 Mbox?

转载 作者:太空狗 更新时间:2023-10-30 00:00:50 26 4
gpt4 key购买 nike

这个有效:

import mailbox

x = mailbox.mbox('filename.mbox') # works

但是如果我只有文件的打开句柄而不是文件名怎么办?

fp = open('filename.mbox', mode='rb')  # for example; there are many ways to get a file-like object
x = mailbox.mbox(fp) # doesn't work

问题:从字节流打开 Mbox 的最佳(最干净、最快)方法是什么 = 一个打开的二进制句柄,而无需首先将字节复制到命名文件中?

最佳答案

mailbox.mbox() 必须在某个时候调用内置函数 open()。因此,一个 hacky 解决方案是拦截该调用并返回预先存在的类文件对象。解决方案草案如下:

import builtins

# FLO stands for file-like object

class MboxFromFLO:

def __init__(self, flo):
original_open = builtins.open

fake_path = '/tmp/MboxFromFLO'
self.fake_path = fake_path
def open_proxy(*args):
print('open_proxy{} was called:'.format(args))
if args[0] == fake_path:
print('Call to open() was intercepted')
return flo
else:
print('Call to open() was let through')
return original_open(*args)

self.original_open = original_open
builtins.open = open_proxy
print('Instrumenting open()')

def __enter__(self):
return mailbox.mbox(self.fake_path)

def __exit__(self, exc_type, exc_value, traceback):
print('Restoring open()')
builtins.open = self.original_open



# Demonstration
import mailbox

# Create an mbox file so that we can use it later
b = mailbox.mbox('test.mbox')
key = b.add('This is a MboxFromFLO test message')

f = open('test.mbox', 'rb')
with MboxFromFLO(f) as b:
print('Msg#{}:'.format(key), b.get(key))

关于 mailbox.mbox future 可能发生的变化的一些注意事项:

  1. mailbox.mbox 除了传递给构造函数的文件外,还可以打开额外的文件。即使没有,猴子补丁 open() 也会被补丁生效时执行的任何其他 Python 代码使用(即只要 MboxFromFLO< 管理的上下文 处于事件状态)。您必须确保您生成的假路径(以便您以后可以识别对 open() 的正确调用,如果有多个这样的调用)不与任何此类文件冲突。

  2. mailbox.mbox 可能决定在打开指定路径之前以某种方式检查它(例如使用 os.path.exists()os. path.isfile() 等),如果该路径不存在,将会失败。

关于python - 从 Python 中打开的类文件对象解析 Mbox?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56820736/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com