1

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

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

4 回答 4

4

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

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

(这是因为mod_time.timetuple()[:4]返回一个像 一样的元组(2013, 1, 8, 21)。因此,使用 acollections.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)
于 2013-01-09T02:40:22.347 回答
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)

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

于 2013-01-09T04:24:15.117 回答
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
于 2013-01-09T04:30:01.703 回答
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))
于 2013-01-10T07:34:32.660 回答