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

时间:2013-05-31 21:34:04

标签: python python-2.7

我有这个代码,它使用相同的前两个字母计算目录中的文件。我想修改它,以便它在修改日期之前完成。因此,如果有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)

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

2 个答案:

答案 0 :(得分:1)

您可以使用groupby来整理文件:

首先,您需要一个将文件映射到其mtime的函数,然后获取按该值排序的文件列表:

from collections import Counter
from itertools import groupby
import os
import datetime

def find_mod_date(basedir):
    return lambda filename: datetime.date.fromtimestamp(
                            os.stat(os.path.join(basedir, filename)).st_mtime)

path="/tmp"
mod_dates_in_path = find_mod_date(path)

files = [fname for fname in os.listdir(path) 
         if os.path.isfile(os.path.join(path, fname))
             and any(name in fname for name in ['red', 'blue'])]
files = sorted(files, key=mod_dates_in_path)

然后按mtime对文件进行分组:

grouping_by_date = groupby(files, key=mod_dates_in_path)

迭代结果并按名称前缀计算:

results = {}
for day, group in grouping_by_date:
    results[day] = Counter(name[:2] for name in group)

for day, prefix_counts in results.iteritems():
    print day
    for prefix, count in prefix_counts.iteritems():
        print "{}: {}".format(prefix, count)

答案 1 :(得分:1)

一种方法是从文件构建一个字典,按其修改日期键入,并使用与您在代码中执行的相似的Counter对象。为了略微简化,我还使用defaultdict Counters

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

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