Python - 按修改日期分组文件[小时]

时间:2013-01-09 02:31:26

标签: python

我正在使用以下脚本来获取目录中的所有文件,然后根据其修改日期对其进行过滤。

dir = '/tmp/whatever'
dir_files = os.listdir(dir)
dir_files.sort(key=lambda x: os.stat(os.path.join(dir, x)).st_mtime)
files = []
for f in dir_files:
    t = os.path.getmtime(dir + '/' + f)
    c = os.path.getctime(dir + '/' + f)
    mod_time = datetime.datetime.fromtimestamp(t)
    created_time = datetime.datetime.fromtimestamp(c)
    if mod_time >= form.cleaned_data['start'].replace(tzinfo=None) and mod_time <= form.cleaned_data['end'].replace(tzinfo=None):
         files.append(f)
return by_hour

我需要更进一步,按照修改后的小时对文件进行分组。有谁知道如何做到这一点?

更新:我想将它们放在字典中({date,hour,files})

更新: 感谢你的回复!。我尝试使用david的响应,但当我输出结果时,它看起来像下面(即它正在分解文件名):

defaultdict(<type 'list'>, {datetime.datetime(2013, 1, 9, 15, 0): ['2', '8', '-', '2', '0', '1', '3', '0', '1', '0', '9', '1', '5', '1', '8', '4', '3', '.', 'a', 'v', 'i', '2', '9', '-', '2', '0', '1', '3', '0', '1', '0', '9', '1', '5', '2', '0', '2', '4', '.', 'a', 'v', 'i', '3', '0', '-', '2', '0', '1', '3', '0', '1', '0', '9', '1', '5', '3', '8', '5', '9', '.', 'a', 'v', 'i', '3', '1', '-', '2', '0', '1', '3', '0', '1', '0', '9', '1', '5', '4', '1', '2', '4', '.', 'a', 'v', 'i', '3', '2', '-', '2', '0', '1', '3', '0', '1', '0', '9', '1', '5', '5', '3', '1', '0', '.', 'a', 'v', 'i', '3', '3', '-', '2', '0', '1', '3', '0', '1', '0', '9', '1', '5', '5', '5', '5', '8', '.', 'a', 'v', 'i'], datetime.datetime(2013, 1, 9, 19, 0): ['6', '1', '-', '2', '0', '1', '3', '0', '1', '0', '9', '1', '9', '0', '1', '1', '8', '.', 'a', 'v', 'i', '6', '2', '-', '2', '0', '1', '3', '0', '1', '0', '9', '1', '9', '0', '6', '3', '1', '.', 'a', 'v', 'i', '6', '3', '-', '2', '0', '1', '3', '0', '1', '0', '9', '1', '9', '1', '4', '1', '5', '.', 'a', 'v', 'i', '6', '4', '-', '2', '0', '1', '3', '0', '1', '0', '9', '1', '9', '2', '2', '3', '3', '.', 'a', 'v', 'i']})

我希望能够存储完整的文件名。另外,我将如何循环并抓取每小时及其所属小时的文件?

我设法通过将其更改为追加来对上述内容进行排序。然而,它并没有从最旧的小时到最近的小时排序。

非常感谢, 本

4 个答案:

答案 0 :(得分:4)

您可以使用以下行将datetime对象舍入到最近的小时:

mod_hour = datetime.datetime(*mod_time.timetuple()[:4])

(这是因为mod_time.timetuple()[:4]返回了像(2013, 1, 8, 21这样的元组。因此,使用collections.defaultdict保留列表字典:

import collections

by_hour = collections.defaultdict(list)
for f in dir_files:
    t = os.path.getmtime(dir + '/' + f)
    mod_time = datetime.datetime.fromtimestamp(t)
    mod_hour = datetime.datetime(*mod_time.timetuple()[:4])
    # for example, (2013, 1, 8, 21)
    by_hour[mod_hour].append(f)

答案 1 :(得分:0)

import os, datetime, operator
dir = "Your_dir_path"
by_hour =sorted([(f,datetime.datetime.fromtimestamp(os.path.getmtime(os.path.join(dir , f)))) for f in os.listdir(dir)],key=operator.itemgetter(1), reverse=True)

上面的代码将根据年份 - &gt;月份 - &gt;日期 - &gt;小时 - &gt;分钟 - &gt;秒格式进行排序。

答案 2 :(得分:0)

基于David的优秀答案,您可以使用itertools.groupby来简化工作:

import os, itertools, datetime

dir = '/tmp/whatever'
mtime = lambda f : datetime.datetime.fromtimestamp(os.path.getmtime(dir + '/' + f))
mtime_hour = lambda f: datetime.datetime(*mtime(f).timetuple()[:4])
dir_files = sorted(os.listdir(dir), key=mtime)
dir_files = filter(lambda f: datetime.datetime(2012,1,2,4) <   mtime(f) < datetime.datetime(2012,12,1,4), dir_files) 
by_hour = dict((k,list(v)) for k,v in itertools.groupby(dir_files, key=mtime_hour)) #python 2.6
#by_hour = {k:list(v) for k,v in itertools.groupby(dir_files, key=mtime_hour)} #python 2.7

答案 3 :(得分:0)

懒洋洋地构建条目,使用UTC时区,只读取修改时间一次:

#!/usr/bin/env python
import os
from collections import defaultdict
from datetime import datetime

HOUR = 3600 # seconds in an hour
dirpath = "/path/to/dir"
start, end = datetime(...), datetime(...)

# get full paths for all entries in dirpath
entries = (os.path.join(dirpath, name) for name in os.listdir(dirpath))
# add modification time truncated to hour
def date_and_hour(path):
    return datetime.utcfromtimestamp(os.path.getmtime(path) // HOUR * HOUR)
entries = ((date_and_hour(path), path) for path in entries)
# filter by date range: [start, end)
entries = ((mtime, path) for mtime, path in entries if start <= mtime < end)
# group by hour
result = defaultdict(list)
for dt, path in entries:
    result[dt].append(path)

from pprint import pprint
pprint(dict(result))