2013-01-09 48 views
1

我使用以下腳本來抓取目錄中的所有文件,然後根據它們的修改日期對它們進行過濾。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 

我需要更進一步,並按照修改後的小時對文件進行分組。有誰知道如何從頭頂上做到這一點?

更新:我想有他們在一本字典({日期,時間,文件})

更新: 感謝您的回覆!我試圖使用大衛的反應,但是當我輸出的結果,它看起來像下面(即它打破了文件名):

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']}) 

我希望得到它來存儲完整的文件名。另外,我將如何循環播放並在每個小時和每個小時所屬的文件夾中抓取文件?

我設法通過改變它來追加以上排序。但是,它不是從最早的小時到最近的時間排序的。

非常感謝, 本

+0

你是什麼意思的「羣他們」?你想構建一個分割文件的列表或字典嗎? –

+0

是的字典,檢查更新的問題 –

+0

..。它不涉及'django';刪除它的標籤。 – namit

回答

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) 
+0

設法整理出來,感謝您的幫助! –

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) 

上面的代碼將會給基於出廠年份 - >月 - >日 - >小時 - >分鐘 - >秒格式。

0

建立在大衛的出色答卷,您可以使用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 
+0

我在最後一行得到一個語法錯誤,當我使用這個:( 另外我不能根據我的問題過濾一個日期範圍 –

+0

我做了2個改變:刪除了dict理解來使用python <2.7,並且根據要求添加一個過濾步驟 –

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)) 
相關問題