Python 在日期拆分聊天日志文件(使用regex)并统计每月的邮件数
我有几个聊天记录日志,我想统计每月发送和接收的邮件数。有些消息对应于文本文件中的一行,但不是全部。因此,我希望在日期和时间拆分消息。然后我想从每个日期中提取月份和年份,计算消息的数量,并在字典中调整这个数字。最后,我想打印月份/年份和消息数 这是源文件的外观(日期为Python 在日期拆分聊天日志文件(使用regex)并统计每月的邮件数,python,Python,我有几个聊天记录日志,我想统计每月发送和接收的邮件数。有些消息对应于文本文件中的一行,但不是全部。因此,我希望在日期和时间拆分消息。然后我想从每个日期中提取月份和年份,计算消息的数量,并在字典中调整这个数字。最后,我想打印月份/年份和消息数 这是源文件的外观(日期为d/m/Y): 这是我的代码,不幸的是它不起作用。因此,我得到了一长串的1: import os import re nummessages = {} datafiles = ("file1.txt", "file2.txt")
d/m/Y
):
这是我的代码,不幸的是它不起作用。因此,我得到了一长串的1:
import os
import re
nummessages = {}
datafiles = ("file1.txt", "file2.txt")
for file in datafiles:
with open(file, "r", encoding="utf8") as infile:
for line in infile:
regexdate = re.compile("([0-9]{2})(\/)([0-9]{2})(\/)([0-9]{4})(,)(\s)([0-9]{2})(:)([0-9]{2})")
messages = regexdate.split(line)
for message in messages:
key = re.search("([0-9]{2})(\/)([0-9]{4})", message)
value = message.count(message)
if key in nummessages.keys():
nummessages[key].append(value)
else:
nummessages[key] = [value]
for key in sorted(nummessages.items()):
print(str(key[0]) + "\t" + str(key[1]))
我想要的输出如下所示:
09/2017: 45 messages
10/2017: 10 messages
...
我做错了什么?(仅供参考,我是Python新手)试试以下方法:
此解决方案的主要思想是解析日志的月份和年份,并将其用作数据
字典中的键。现在,对于每个匹配相同月份和年份的日志,字典的值将增加1
data = {} # outside
for file in datafiles:
with open(file, "r", encoding="utf8") as infile:
for l in infile:
m = re.match(r'\d{2}/(\d{2})/(\d{4})', l)
if m:
key = '{}/{}'.format(m.group(1), m.group(2))
if key not in data.keys():
data[key] = 0
data[key] += 1
# printing
for k in data:
print '{}: {} messages'.format(k, data[k])
行
引用日志文件中的每一行
使用
集合。defaultdict
Ex:
import re
from collections import defaultdict
result = defaultdict(int)
with open(file, "r", encoding="utf8") as infile:
for line in infile: #Iterate Each line
line = line.strip()
m = re.match("(\d{2}/(\d{2})/(\d{4}))", line) #Check if line starts with date
if m:
result["{}/{}".format(m.group(2), m.group(3))] += 1 #form month/year and get count.
print(result)
这是如何处理文件中超过一行的消息的?此代码假定其输入已经是从您打开的文件中提取的单行。在您的示例代码中,只需将其放入循环中,它就可以完美工作。谢谢,该脚本似乎有两个更正:在
数据[key]+=1
之前缺少一个else
,并且print()
周围的括号缺少最后一行!那太好了!我将更新我的答案以补充您的意见。:)我假设您使用的是python 3?我正在通过python 2.7进行编译。顺便说一句,缺少的else
是故意的。:)不幸的是,对我来说,如果没有else,脚本就无法工作
import re
from collections import defaultdict
result = defaultdict(int)
with open(file, "r", encoding="utf8") as infile:
for line in infile: #Iterate Each line
line = line.strip()
m = re.match("(\d{2}/(\d{2})/(\d{4}))", line) #Check if line starts with date
if m:
result["{}/{}".format(m.group(2), m.group(3))] += 1 #form month/year and get count.
print(result)