【发布时间】:2018-02-20 16:07:28
【问题描述】:
所以除了一些 tKintner 经验(一些 GUI 实验)之外,我还是 python 新手。
我读取了一个 .mbox 文件并将纯文本/文本复制到一个字符串中。此文本包含一个注册表单。因此,居住在伦敦枫树街为“MultiVendor XXVideos”公司工作的 Stefan 已通过电子邮件注册订阅。
Name_OF_Person: Stefan
Adress_HOME: London, Maple
Street
45
Company_NAME: MultiVendor
XXVideos
我想获取这些数据并放入带有列的 .csv 行 “姓名”、“地址”、“公司”、...
现在我试着切割一切。对于调试,我使用“打印”(IDE = KATE/KDE + 终端... :-D)。 问题是,数据在关键字之后包含多行,但我只得到第一行。
您将如何改进我的代码?
import mailbox
import csv
import email
from time import sleep
import string
fieldnames = ["ID","Subject","Name", "Adress", "Company"]
searchKeys = [ 'Name_OF_Person','Adress_HOME','Company_NAME']
mbox_file = "REG.mbox"
export_file_name = "test.csv"
if __name__ == "__main__":
with open(export_file_name,"w") as csvfile:
writer = csv.DictWriter(csvfile, dialect='excel',fieldnames=fieldnames)
writer.writeheader()
for message in mailbox.mbox(mbox_file):
if message.is_multipart():
content = '\n'.join(part.get_payload() for part in message.get_payload())
content = content.split('<')[0] # only want text/plain.. Ill split #right before HTML starts
#print content
else:
content = message.get_payload()
idea = message['message-id']
sub = message['subject']
fr = message['from']
date = message['date']
writer.writerow ('ID':idea,......) # CSV writing will work fine
for line in content.splitlines():
line = line.strip()
for pose in searchKeys:
if pose in line:
tmp = line.split(pose)
pmt = tmp[1].split(":")[1]
if next in line !=:
print pose +"\t"+pmt
sleep(1)
csvfile.closed
输出:
OFFICIAL_POSTAL_ADDRESS =20
这里,行不见了.. 来自文件:
OFFICIAL_POSTAL_ADDRESS: =20
London, testarossa street 41
编辑2:
@亚尼夫 谢谢,我仍在尝试理解每一步,但只是想发表评论。我喜欢使用列表/矩阵/向量“key_value_pairs”的想法
电子邮件中的关键字数量约为 20 个字。此外,我的价值观有时会被“=”换行。 我在想这样的事情:
Search text for Keyword A,
if true:
search text from Keyword A until keyword B
if true:
copy text after A until B
Name_OF_=
Person: Stefan
Adress_
=HOME: London, Maple
Street
45
Company_NAME: MultiVendor
XXVideos
也许来自 EMAIL.mbox 的 HTML 更容易处理?
<tr><td bgcolor=3D"#eeeeee"><font face=3D"Verdana" size=3D"1">
<strong>NAM=
E_REGISTERING_PERSON</strong></font></td><td bgcolor=3D"#eeeeee"><font
fac=e=3D"Verdana" size=3D"1">Stefan </font></td></tr>
但是“=”仍然存在 我应该将 ["="," = "] 替换为 "" 吗?
【问题讨论】:
-
你确定顺序总是一样的吗 1)
Name_OF_Person:, 2)Adress_HOME:, 3)Company_NAME:? -
这是我们网站上的 html 注册表格,我必须使用过去 10 年的注册表格(x~10000 封邮件)并创建一个包含所有数据的 csv。形式改变了一次,除非它总是一样的。编辑:但是在此之前和之后有大约 25 个条目,每次都有不同的行号
-
解释不同的行号?意味着每个标题有不同的行数?只是在提出解决方案之前澄清问题
-
if next in line !=:不可能是对的。请只粘贴实际可以运行的代码。 -
一切都好。 :) 我解决了指定的问题。如果是这种情况,正则表达式或 Yaniv 提出的解决方案是最好的选择