0

在将文件解析为电子邮件后,我仍然需要使用该文件,但电子邮件解析器正在关闭它。

我能做些什么?

谢谢

(venv3.4)ubuntu@core01:~/tmp$ cat tmp.eml
From: Example Person <example.person@example.org>
To: another.person@example.org
Subject: test2
Date: Sun, 2 Mar 2014 15:42:27 +1100

Hello

(venv3.4)ubuntu@core01:~/tmp$ cat tmp.py

from email.parser import BytesParser, BytesHeaderParser
from email import policy

f = open('tmp.eml', 'rb')

def parsefromfile(f, headersonly=None):
    f.seek(0)
    if headersonly:
        msg = BytesHeaderParser(policy=policy.default).parse(f)
    else:
        msg = BytesParser(policy=policy.default).parse(f)
    print(msg)
    print(msg.get('date', None))
    f.seek(0)
    print(f.read())

parsefromfile(f)


(venv3.4)ubuntu@core01:~/tmp$ python tmp.py

From: Example Person <example.person@example.org>
To: another.person@example.org
Subject: test2
Date: Sun, 2 Mar 2014 15:42:27 +1100

Hello


Sun, 02 Mar 2014 15:42:27 +1100
Traceback (most recent call last):
  File "tmp.py", line 17, in <module>
    parsefromfile(f)
  File "tmp.py", line 14, in parsefromfile
    f.seek(0)
ValueError: seek of closed file
4

2 回答 2

1

请改用 parsebytes 函数。使用 .read() 获取文件的字符串内容并将其传入,然后继续对文件对象进行操作。

于 2014-05-12T00:40:33.403 回答
1

所以,这实际上是 python 中的一个错误 - http://bugs.python.org/issue21476。我认为,该修复程序将在 python3.5 和下一个次要版本的 python 3.4 即 3.4.2 上上线。文件描述符不应该被关闭,并且 OPs 代码应该对这些版本有效。

于 2014-06-27T17:35:26.410 回答