社区首页 >问答首页 >从具有特定主题行的所有outlook电子邮件中提取变量数据,然后从正文中获取日期

从具有特定主题行的所有outlook电子邮件中提取变量数据,然后从正文中获取日期
EN

Stack Overflow用户
提问于 2021-11-05 08:36:07
回答 1查看 53关注 0票数 1

我每天都会收到一封电子邮件,上面写着当天售出的水果数量。虽然我现在已经想出了一些代码来记录未来的相关数据,但我一直无法向后执行。

数据存储在电子邮件正文中,如下所示:

代码语言:javascript
代码运行次数:0
复制
Date of report:,01-Jan-2020
Apples,8
Pears,5
Lemons,7
Oranges,9
Tomatoes,6
Melons,3
Bananas,0
Grapes,4
Grapefruit,8
Cucumber,2
Satsuma,1

我想让代码做的是首先搜索我的电子邮件并找到与特定主题匹配的电子邮件,逐行迭代并找到我正在搜索的变量,然后将它们记录在一个数据帧中,并将“报告日期”记录在日期列中,并转换为格式:"%m-%d-%Y“。

我认为我可以通过对我编写的代码进行一些修改来实现这一点,以便继续跟踪它:

代码语言:javascript
代码运行次数:0
复制
# change for the fruit you're looking for
Fruit_1 = "Apples"
Fruit_2 = "Pears"

outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.GetDefaultFolder(6) 
messages = inbox.Items
messages.Sort("[ReceivedTime]", True)

# find data email
for message in messages:
    if message.subject == 'FRUIT QUANTITIES':
        if Fruit_1 and Fruit_2 in message.body: 
            data = str(message.body)
            break
        else:
            print('No data for', Fruit_1, 'or', Fruit_2, 'was found')
            break

fruitd = open("fruitd.txt", "w") # copy the contents of the latest email into a .txt file
fruitd.write(data)
fruitd.close()

def get_vals(filename: str, searches: list) -> dict:
    #Searches file for search terms and returns the values
    dct = {}
    with open(filename) as file:
        for line in file:
            term, *value = line.strip().split(',')
            if term in searches:
                dct[term] = float(value[0]) # Unpack value 
    # if terms are not found update the dictionary w remaining and set value to None
    if len(dct.keys()) != len(searches):
        dct.update({x: None for x in search_terms if x not in dct})
    return dct


searchf = [
    Fruit_1, 
    Fruit_2
] # the list of search terms the function searches for

result = get_vals("fruitd.txt", searchf) # search for terms 
print(result)

# create new dataframe with the values from the dictionary
d = {**{'date':today}, **result}
fruit_vals = pd.DataFrame([d]).rename(columns=lambda z: z.upper())
fruit_vals['DATE'] = pd.to_datetime(fruit_vals['DATE'], format='%d-%m-%Y')
print(fruit_vals)

我创建了一个名为'fruitd‘的.txt,因为我不确定如何才能以其他方式遍历电子邮件正文。不幸的是,我不认为为过去的每一封电子邮件创建一个.txt是真正可行的,我想知道是否有更好的方法来做到这一点?

任何建议或指示都将非常受欢迎。

**EDIT理想情况下希望获得搜索列表中的所有变量;因此,如果需要,Fruit_1 & Fruit_2可以将其扩展为Fruit_3 + Fruit_4 (等)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-05 09:47:11

代码语言:javascript
代码运行次数:0
复制
#PREP THE STUFF
Fruit_1 = "Apples"
Fruit_2 = "Pears"
SEARCHF = [
    Fruit_1, 
    Fruit_2
]

#DEF THE STUFF
# modified to take a list of list of strs as `report` arg
# apparently IDK how to type-hint; type-hinting removed
def get_report_vals(report, searches):
    dct = {}
    for line in report:
        term, *value = line
        # `str.casefold` is similar to `str.lower`, arguably better form
        # if there might ever be a possibility of dealing with non-Latin chars
        if term.casefold().startswith('date'):
            #FIXED (now takes `date` str out of list)
            dct['date'] = pd.to_datetime(value[0])
        elif term in searches:
            dct[term] = float(value[0])
    if len(dct.keys()) != len(searches):
        # corrected (?) `search_terms` to `searches`
        dct.update({x: None for x in searches if x not in dct})
    return dct


#DO THE STUFF
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.GetDefaultFolder(6) 
messages = inbox.Items
messages.Sort("[ReceivedTime]", True)

results = []

for message in messages:
    if message.subject == 'FRUIT QUANTITIES':
        # are you looking for:
        #  Fruit_1 /and/ Fruit_2
        # or:
        #  Fruit_1 /or/  Fruit_2
        if Fruit_1 in message.body and Fruit_2 in message.body:
            # FIXED
            data = [line.strip().split(",") for line in message.body.split('\n')]
            results.append(get_report_vals(data, SEARCHF))
        else:
            pass

fruit_vals = pd.DataFrame(results)
fruit_vals.columns = map(str.upper, fruit_vals.columns)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69856460

复制
相关文章
【编程基础】如何了解c语言中的位运算?
计算机的各种运算最小单位是字节,但是有时候只对某个位(bit)感兴趣,C语言提供了一些列位运算符来完成这个任务。这些操作非常重要,尤其是在嵌入式开发中会常常用到,这也是为什么嵌入式基本上都是选用C语言来开发的重要原因之一。 C语言的位运算有一下六中: & 按位与 | 按位或 ^ 按位亦或 ~ 按位取反 << 左移 >> 右移 按位与& 两个对应的位为1,运算后对应位为1,否则为0,比如:10101100 & 01101001 = 00101000。 按位或| 两
程序员互动联盟
2018/03/14
1.8K0
【编程基础】如何了解c语言中的位运算?
【编程基础】c语言中获取整数和浮点数的符号位
1. 为什么要获得符号位 很多时候,我们需要判断数值的正负,来做相应的逻辑处理。条件判断语句可以很好的完成这个需求。有时候会有下面的情况, if (x > 0) { x = x - 1; } else { x = 1 - x; } if (x < 0) { x = -x; } 正负只是数值的符号位变化,或是计算结果的符号位变化。但是我们需要用一个判断,首先条件判断会影响效率,其次格式不够简洁美观。所以,有时候希望能不用条件判断也解决问题。而数值的符号位已
程序员互动联盟
2018/03/13
2.2K0
C语言中数组的总结
数组的创建:在创建数组时,我们必须定义数组的类型和大小,数组的大小不能为0,数组中的元素类型都是相同的。 eg:
全栈程序员站长
2022/08/14
2K0
C语言中数组的总结
[日常] C语言中的字符数组和字符串
c语言字符数组和字符串: 1.存放字符的数组称为字符数组 char str[] 2.'\0'也被称为字符串结束标志 3.由" "包围的字符串会自动在末尾添加'\0' 4.逐个字符地给数组赋值并不会自动添加'\0' 5.局部变量初始化为零值会自动添加结束标志 6.直接使用一个指针指向字符串的形式 char* str 7.最根本的区别是在内存中的存储区域不一样,字符数组存储在全局数据区或栈区,第二种形式的字符串存储在常量区。全局数据区和栈区的字符串(也包括其他数据)有读取和写入的权限,而常量区的字符串(也包括其他数据)只有读取权限,没有写入权限。
唯一Chat
2019/09/10
2.4K0
c语言中位运算符的用法_c语言中位运算符的优先级
程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作。运位算包括位逻辑运算和移位运算,位逻辑运算能够方便地设置或屏蔽内存中某个字节的一位或几位,也可以对两个数按位相加等;移位运算可以对内存中某个二进制数左移或右移几位等。
全栈程序员站长
2022/11/10
8160
详解C语言中的数组指针与指针数组
数组指针的意思即为通过指针引用数组,p先和*结合,说明了p是一个指针变量,指向一个大小为5的数组。所以,int (*p)[5]即为一个数组指针。int *p[5]则是一个大小为5且存放整型指针的数组。
全栈程序员站长
2022/09/19
3.5K0
详解C语言中的数组指针与指针数组
C语言中的&和*
试想一下,如果没有&和*的存在,你可能每天都在为计算和寻找某个变量在哪里而发愁呢!
手撕代码八百里
2021/07/20
4.4K0
如何确定 C 语言中数组的大小
但上面的写法还有点不足。如果以后数组 a 的类型变为其它类型,那么 sizeof(int) 这种写法就会出现兼容问题,所以建议下面的写法,
ClearSeve
2022/02/11
2.2K0
C语言中指针数组和数组指针的区别
指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称。 数组指针:首先它是一个指针,它指向一个数组。在32 位系统下永远是占4 个字节,至于它指向的数组占多少字节,不知道。它是“指向数组的指针”的简称。 下面到底哪个是数组指针,哪个是指针数组呢: A) int *p1[10]; B) int (*p2)[10]; 这里需要明白一个符号之间的优先级问题。 “[]”的优先级比“*”要高。p1 先与“[]”结合,构成一个数组的定义,数组名为p1,
用户1215536
2018/02/05
2K0
C语言中指针数组和数组指针的区别
c语言中位运算符_位运算符的用法
C语言的运算符是一个很有意思的东西,运用起来可以解决很多麻烦的事,但是想要灵活应用也有一定的难度,总结一下c语言运算符的用法和一些常用技巧.
全栈程序员站长
2022/11/09
8870
C语言中数组长度的计算详解
C语言字符串长度的计算可以使用strlen(str); 但是对于数组长度的大小却没有相关函数可以使用;
一个会写诗的程序员
2023/01/08
3.1K0
C语言中数组长度的计算详解
从Ndom语浅谈语言中的进制
这题粗看复杂,其实不然。首先不难看出,abo、an并不是数字,所以不是加法就是乘法。因为abo出现的十分多,所以我们可以简单地假设abo是加法。接下来需要确定进制。我们知道1-10的乘方之间,出现了三个单独的词。不难得出,肯定1个是1,一个是基数的平方。除了这两个,只剩一个单独的词,那么这个词只可能是2^2=4。由此我们可以确定,Ndom语言的数字表达的基数肯定大于4且小于9。因为nif为很多长词的开头,所以nif应该是基数的平方。在题2的等式我们发现meregh乘上sas结尾的词,结果竟然还是以meregh尾!所以很明显sas就是1,于是thonith就是4。接着找,就找到了余下几个小于基数的词(于abo、an之后的较小):ithin、meregh、thef(可能是2、3、5)。剩下的mer、nif、tondor估计就是基数的倍数了,通过观察nif abo tondor abo mer abo thonith,发现nif>tondor>mer。按照推论,mer abo ithin应该是第三小的数字——9,那么mer应该就是基数了。ithin肯定不是1、4,所以排除5、8进制可能。那么就只剩下6、7进制两种可能了。分析得mer an thef abo thonith是第4小的,即16。mer*thef+4=16⇒mer*thef=12。所以只有一种可能:Ndom语言的数字是6进制。所以mer为6,thef为2,nif是mer的平方即36,ithin是9-6=3。排除法得,meregh是5。最后还有一个tondor,通过推断tondor abo mer abo sas≥6*2+6+1=19最近的平方数是25,可以判断tondor是18。至此,我们已经推断完成所有的词。剩下就是一些小小的规则,比如表示72,并不是nif an thef,而是直接nif thef。还有就是大的数字一定会在前。所以我们就能写出:58=36+18+4也就是nif abo tondor abo thonith,而87=36*2+6*2+3即nif thef abo mer an thef abo ithin。参考答案:
KAAAsS
2022/01/13
11.1K0
从Ndom语浅谈语言中的进制
【编程经验】C语言中左值和右值的区别
黄老师原创精品文章哦~ 在C语言学习过程中,大家或许听到过左值和右值的概念,甚至在调试程序时编译器也会给出” left operand must be l-value ” 即左操作数必须为左值!,今天我们将为大家详细解释这两个词,以及两者的区别! 简单而言,在赋值运算符“=”左边的就是左值,在赋值运算符“=”后边的就是右值,感觉像是废话,但非常好理解。但更多时候,我们是为了学习和理解不同情况下左值和右值的区别,下面来举例依次说明,着层深入,来让大家解渴! 1.变量做左值和右值的区别: 如 x = 2; 这里
编程范 源代码公司
2018/04/18
2.4K0
【编程经验】C语言中左值和右值的区别
C语言中的柔性数组 C语言结构体中char[0]和char[1]的用法
我在进行Linux 64位驱动程序兼容32位应用程序的适配过程中,深深的感觉指针操作带来的麻烦,特别是应用层的32位指针传到内核层后,指针大小变成64位,需要进行频繁的大小调整,及其难受。等我快完成所有工作的时候,听一位同事说可以使用char[0]用法来代替指针,我差点一口老血喷出来。“你咋不早说…”。接下来从网上各种google,发现了这种用法的巧妙,特写下此篇文章,以做记录。 (PS:还是要感谢我那位同事YYL,让我又get到一个技能^_^)
好派笔记
2021/09/17
2.9K0
c语言中按位异或运算_c语言按位与怎么算
备注 表达式可以是其他“与”表达式,或(遵循下面所述的类型限制)相等表达式、关系表达式、加法表达式、乘法表达式、指向成员的指针表达式、强制转换表达式、一元表达式、后缀表达式或主表达式。 按位“与”运算符 (&) 会将第一操作数的每一位与第二操作数的相应位进行比较。如果两个位均为 1,则对应的结果位将设置为 1。否则,将对应的结果位设置为 0。 按位“与”运算符的两个操作数必须为整型。 算术转换中所述的常用算术转换将应用于操作数。 & 的运算符关键字
全栈程序员站长
2022/11/18
2.8K0
C语言中如何获取数组的中位数
在C语言编程中,获取数组的中位数是一项常见而重要的任务。中位数是一个数组中的一个特殊值,它将该数组分为两个等长的部分。当数组长度为奇数时,中位数就是位于数组中间位置的元素;当数组长度为偶数时,中位数是中间两个元素的平均值。
用户10354340
2023/08/14
7910
c语言中getchar的运用_c语言中gets和getchar
2.前面的scanf()在读取输入时会在缓冲区中留下一个字符’\n'(输入完s[i]的值后按回车键所致),
全栈程序员站长
2022/09/27
2.9K0
【编程经验】C语言中左值和右值的区别
在C语言学习过程中,大家或许听到过左值和右值的概念,甚至在调试程序时编译器也会给出” left operand must be l-value ” 即左操作数必须为左值!,今天我们将为大家详细解释这两个词,以及两者的区别! 简单而言,在赋值运算符“=”左边的就是左值,在赋值运算符“=”后边的就是右值,感觉像是废话,但非常好理解。但更多时候,我们是为了学习和理解不同情况下左值和右值的区别,下面来举例依次说明,着层深入,来让大家解渴! 开始了! 变量做左值和右值的区别
编程范 源代码公司
2018/04/18
1.5K0
【编程经验】C语言中左值和右值的区别
再议 C 语言中的指针与数组(4)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
耕耘实录
2019/09/18
1.5K0
在c语言中,数组 a[i++] 和数组 a[++i] 有区别吗? && 在c语言中,数组 a[0]++; 又是什么意思?
b = a++;    //先计算表达式的值,即先把a赋值给了b;然后a再自加1。 b = ++a;    //先a自加1后;然后把a自加后得到的赋值给b。
黑泽君
2018/10/11
3.3K0

相似问题

创建自定义时间戳存储桶bigquery

11

如何从云存储桶自动创建BigQuery表?

12

bigquery创建间隔15分钟的时间戳桶

19

使用时间戳主题模式的PubSub & BigQuery订阅

13

Laravel使用时间戳列从表中获取行

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文