python – 按名称计算文件名,按修改日期列出

我有这个代码,它使用相同的前两个字母计算目录中的文件.我想修改它,以便它在修改日期之前完成.因此,如果有10个以PR开头的文件和10个以FM开头的文件,2013年5月17日各5个,2013年5月18日各5个,则输出为:

17
FM 5
PR 5
18
FM 5
PR 5
import os
from collections import Counter

path = '/My/path/to/the/directory/test'

counts = Counter(fname[:2] for fname in os.listdir(path) if
                      os.path.isfile(os.path.join(path, fname)) 
                  and 'blue' in fname 
                  or 'green' in fname 
                  or 'yellow' in fname 
                  or 'red' in fname 
                  or 'purple' in fname)

for initials, count in counts.most_common():
    print '{}: {:>20}'.format(initials,count)

我可以打印出修改日期,但不能与计数一起打印.我将不胜感激任何帮助.我原本想使用一个调度程序(有一个很好的例子可以遵循),但是它的用法陷入困境并让它触发.因为我一直在阅读有关正则表达式以及如何在文件名中提取月份的日期,但大多数人都对如何连接它们感到困惑.

最佳答案 一种方法是从文件构建一个字典,按其修改日期键入,并使用与您在代码中执行的相似的Counter对象.为了略微简化,我还使用了计数器的默认值.

所以,给定一个包含这些文件的文件夹&其中的修改日期用于测试:

blue1       05/30/2013  06:37 PM
green1      05/30/2013  06:37 PM
green2      05/30/2013  06:37 PM
purple1     05/30/2013  06:37 PM
purple2     05/30/2013  06:37 PM
purple3     05/30/2013  06:37 PM
purple4     05/30/2013  06:37 PM
purple5     05/30/2013  06:37 PM
red1        05/31/2013  06:38 PM
red2        05/31/2013  06:38 PM
red3        05/31/2013  06:38 PM
red4        05/31/2013  06:38 PM
yellow1     05/31/2013  06:38 PM
yellow2     05/31/2013  06:38 PM
yellow3     05/31/2013  06:38 PM

这段代码:

from collections import defaultdict, Counter
from datetime import date
from operator import itemgetter
import os

COLORS = ('blue', 'green', 'yellow', 'red', 'purple')
NUM_LETTERS = 2
path = 'testdir'

date_counters = defaultdict(Counter)

for filename, filepath in ((name, os.path.join(path, name))
                                for name in os.listdir(path)):
    if (os.path.isfile(filepath) and any(color in filename for color in COLORS)):
        mod_date = date.fromtimestamp(os.stat(filepath).st_mtime)
        date_counters[mod_date].update((filename[:NUM_LETTERS],))

for mod_date in sorted(date_counters):  # sort by file group's modification date
    print mod_date.day
    for initials, count in sorted(date_counters[mod_date].iteritems(),
                                  key=itemgetter(1)):
        print initials, count

产生了这个输出:

30
bl 1
gr 2
pu 5
31
ye 3
re 4
点赞