0

本质上,我想做一个临时的超级字数统计,但我不确定如何从目录路径(作为参数传入)创建一个 dict 对象,而不是一个列表来做我需要做的事情。

虽然我想创建一个字典对象,但我还想使用电子邮件模块将作为文件名的键的 ASCII 值格式化为电子邮件或消息对象。然后我想使用有效负载提取正文并以这种方式解析它。我在下面有一些例子:

mylist=os.listdir(sys.stdin)
for emails in mylist:
    email_str = emails.open()
    #uncertain if this will get all emails and their content or not
    #all emails are supposed to have a unique identifier, they are essentially still just ascii
    file_dict = {emails : email_str}
#file_dict = dict(zip(mylist, mylist))
for emails in file_dict[emails]:
    msg = email.message_from_string(email_str)
    body = msg.get_payload(decode=True)
    #I'm not entirely sure how message objects and sub objects work, but I want the header to 
    #signature and I'm not sure about the type of emails as far as header style
    #pretend I have a parsing method here that implements the word count and prints it as a dict:
    body.parse(regex)

除了解析它们的值之外,我并不完全需要这些键,因此我可以考虑使用 message_from_file 代替。

4

2 回答 2

0

您可以使用任何字符串作为文件路径,甚至可以使用相对文件路径。如果您只是想为自己格式化数据,您可以遍历您的电子邮件列表并存储输出。

for emailpath in list_of_email_paths
    emailpath = 'someemailpath'
    # open path -- only works if path exists.
    f = open(emailpath)
    file_dict[emailpath] = f.read()
    f.close()

使用打开的文件对象作为键不是一个好主意(如果可能的话,只需读取它们并将字符串存储为标识符。阅读文档以os.path获取更多信息(顺便说一句 - 您必须使用 导入import os,而不是import os.path

除此之外,任何不可变对象或引用都可以是字典键,因此将路径存储为键没有问题。Python不关心路径来自哪里,dict也不关心它的键是否是路径;)

于 2012-04-09T04:49:38.180 回答
0

不幸的是,因为您要求一次显示这么多信息,所以我的回答必须更笼统一些才能概述它们。即使您说您的示例都是纯伪代码,但它完全错误,以至于很难知道您理解什么以及您不了解哪些部分,因此我将涵盖您在评论中所说的所有基础。

如何读取文件

您在滥用os.listdir,因为它采用字符串路径,而不是文件类型对象。但就个人而言,我喜欢使用glob. 它节省了几个步骤,让您获得完整路径,并按模式过滤。让我们假设您所有的电子邮件文件都以.mail

import sys
import glob

first_path = sys.argv[1]
pattern = "%s/*.mail" % first_path
for mail in glob.iglob(pattern):
    # with context will close the file automatically
    with open(main) as f:
        data = f.read()
        # do something with data here

解析电子邮件格式

使用该email模块的示例很广泛,所以除了给您一个查看链接之外,我在这里展示它们没有任何意义:http: //docs.python.org/library/email-examples.html
如果文件实际上是电子邮件,那么您应该能够使用此模块来解析它们并阅读每封邮件的消息正文

使用字典

在这种情况下使用字典与 python dict 的任何一般情况没有什么不同。您将从创建一个空字典开始:

file_dict = {}

在您的目录列表的每个循环中,您将始终拥有字符串路径名,您希望将其作为您的密钥。无论您是使用第一个示例读取文件原始数据,还是使用电子邮件模块获取消息正文,无论哪种方式,您最终都会得到一些文本数据块。

for mail in glob.iglob(pattern):
    ...
    # do stuff to get the text data from the file
    data = some_approach_to_reading_file()
    ...
    file_dict[mail] = data

现在你有一个file_dict键是原始文件的路径,值是读取的数据。

概括

有了这三个部分,您应该有大量的一般信息可以将它们放在一起。

于 2012-04-09T20:41:05.520 回答