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)