2008-10-03 298 views

回答

41

下面是一個更詳細的@Greg Hewgill's answer版本。這是最符合問題要求的。它區分創建日期和修改日期(至少在Windows上)。

#!/usr/bin/env python 
from stat import S_ISREG, ST_CTIME, ST_MODE 
import os, sys, time 

# path to the directory (relative or absolute) 
dirpath = sys.argv[1] if len(sys.argv) == 2 else r'.' 

# get all entries in the directory w/ stats 
entries = (os.path.join(dirpath, fn) for fn in os.listdir(dirpath)) 
entries = ((os.stat(path), path) for path in entries) 

# leave only regular files, insert creation date 
entries = ((stat[ST_CTIME], path) 
      for stat, path in entries if S_ISREG(stat[ST_MODE])) 
#NOTE: on Windows `ST_CTIME` is a creation date 
# but on Unix it could be something else 
#NOTE: use `ST_MTIME` to sort by a modification date 

for cdate, path in sorted(entries): 
    print time.ctime(cdate), os.path.basename(path) 

實施例:

$ python stat_creation_date.py 
Thu Feb 11 13:31:07 2009 stat_creation_date.py 
87

我已經在過去這樣做的Python腳本,以確定一個目錄中的最後更新文件:

import glob 
import os 

search_dir = "/mydir/" 
# remove anything from the list that is not a file (directories, symlinks) 
# thanks to J.F. Sebastion for pointing out that the requirement was a list 
# of files (presumably not including directories) 
files = filter(os.path.isfile, glob.glob(search_dir + "*")) 
files.sort(key=lambda x: os.path.getmtime(x)) 

這應該做你要找的基於文件的修改時間。

編輯:請注意,如果需要,您也可以使用os.listdir()來代替glob.glob() - 我在原始代碼中使用glob的原因是我只想使用glob來搜索對於具有一組特定文件擴展名的文件,glob()更適合。要使用listdir,看起來是這樣的:

import os 

search_dir = "/mydir/" 
os.chdir(search_dir) 
files = filter(os.path.isfile, os.listdir(search_dir)) 
files = [os.path.join(search_dir, f) for f in files] # add path to each file 
files.sort(key=lambda x: os.path.getmtime(x)) 
+0

水珠()是好的,但要記住,它會跳過開頭的文件一段時間。 * nix系統將這些文件視爲隱藏(因此將其從列表中省略),但在Windows中它們是普通文件。 – efotinis 2008-10-03 19:31:24

+0

這些解決方案不會從列表中排除dirs。 – Constantin 2008-10-03 21:00:48

+0

您的os.listdir解決方案缺少os.path.join: files.sort(lambda x,y:cmp(os.path.getmtime(os.path.join(search_dir,x)),os.path。 getmtime(os.path.join(search_dir,y)))) – 2008-10-04 02:56:11

-4

也許你應該使用shell命令。在Unix/Linux中,查找管道可能會做你想做的事情。

17

這裏是一個班輪:

import os 
import time 
from pprint import pprint 

pprint([(x[0], time.ctime(x[1].st_ctime)) for x in sorted([(fn, os.stat(fn)) for fn in os.listdir(".")], key = lambda x: x[1].st_ctime)]) 

這就要求os.listdir()來獲取文件名列表,然後調用每一個os.stat()來獲取創建時間,然後排序反對創作時間。

請注意,此方法僅爲每個文件調用一次os.stat(),這比在排序中爲每個比較調用它更有效。

15

這裏是我的版本:

def getfiles(dirpath): 
    a = [s for s in os.listdir(dirpath) 
     if os.path.isfile(os.path.join(dirpath, s))] 
    a.sort(key=lambda s: os.path.getmtime(os.path.join(dirpath, s))) 
    return a 

首先,我們所建立的文件名列表。 isfile()用於跳過目錄;如果應該包含目錄,則可以省略它。然後,我們使用修改日期作爲關鍵字就地對列表進行排序。

4
sorted(filter(os.path.isfile, os.listdir('.')), 
    key=lambda p: os.stat(p).st_mtime) 

你可以使用os.walk('.').next()[-1],而不是與os.path.isfile過濾,但還有死的符號鏈接列表,並os.stat將無法​​在他們身上。

13

有一個os.path.getmtime函數給出的秒數從epoch 和應該比os.stat更快。

os.chdir(directory) 
sorted(filter(os.path.isfile, os.listdir('.')), key=os.path.getmtime) 
1

這是一個基本的步驟學習:

import os, stat, sys 
import time 

dirpath = sys.argv[1] if len(sys.argv) == 2 else r'.' 

listdir = os.listdir(dirpath) 

for i in listdir: 
    os.chdir(dirpath) 
    data_001 = os.path.realpath(i) 
    listdir_stat1 = os.stat(data_001) 
    listdir_stat2 = ((os.stat(data_001), data_001)) 
    print time.ctime(listdir_stat1.st_ctime), data_001 
8

下面是使用水珠不帶過濾器,如果你想有一定的延伸日期順序(Python 3中)讀取文件我的答案。

dataset_path='/mydir/' 
files = glob.glob(dataset_path+"/morepath/*.extension") 
files.sort(key=os.path.getmtime) 
14

不改變目錄:

import os  

path = '/path/to/files/' 
name_list = os.listdir(path) 
full_list = [os.path.join(path,i) for i in name_list] 
time_sorted_list = sorted(full_list, key=os.path.getmtime) 

print time_sorted_list 

# if you want just the filenames sorted, simply remove the dir from each 
sorted_filename_list = [ os.path.basename(i) for i in time_sorted_list] 
print sorted_filename_list 
1

亞歷克斯考文垂的答案,如果該文件是一個符號鏈接到所沒有的文件會產生一個例外,以下代碼糾正這個問題的答案:

import time 
import datetime 
sorted(filter(os.path.isfile, os.listdir('.')), 
    key=lambda p: os.path.exists(p) and os.stat(p).st_mtime or time.mktime(datetime.now().timetuple()) 

當文件不存在時,將使用now(),並且符號鏈接將位於列表的最後。

1

在蟒蛇3.5+

from pathlib import Path 
sorted(Path('.').iterdir(), key=lambda f: f.stat().st_mtime) 
相關問題