Câu trả lời:
Cập nhật : để sắp xếp dirpath
các mục nhập theo ngày sửa đổi trong Python 3:
import os
from pathlib import Path
paths = sorted(Path(dirpath).iterdir(), key=os.path.getmtime)
(đặt câu trả lời của @ Pygirl ở đây để nhìn rõ hơn)
Nếu bạn đã có một danh sách tên tệp files
, thì hãy sắp xếp nó tại chỗ theo thời gian tạo trên Windows:
files.sort(key=os.path.getctime)
Ví dụ, danh sách các tệp bạn có thể nhận được bằng cách sử dụng glob
như trong câu trả lời của @ Jay .
câu trả lời cũ
Đây là phiên bản dài hơn @Greg Hewgill
của câu trả lời . Nó là phù hợp nhất với các yêu cầu câu hỏi. Nó tạo ra sự khác biệt giữa ngày tạo và sửa đổi (ít nhất là trên 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)
Thí dụ:
$ python stat_creation_date.py
Thu Feb 11 13:31:07 2009 stat_creation_date.py
cdate
là số giây trôi nổi kể từ Epoch.
Tôi đã làm điều này trong quá khứ cho một tập lệnh Python để xác định các tệp được cập nhật mới nhất trong một thư mục:
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 = list(filter(os.path.isfile, glob.glob(search_dir + "*")))
files.sort(key=lambda x: os.path.getmtime(x))
Điều đó sẽ làm những gì bạn đang tìm kiếm dựa trên tập tin mtime.
EDIT : Lưu ý rằng bạn cũng có thể sử dụng os.listdir () thay cho global.glob () nếu muốn - lý do tôi sử dụng global trong mã gốc của mình là vì tôi muốn sử dụng global để chỉ tìm kiếm các tệp với một bộ cụ thể của phần mở rộng tập tin, mà global () phù hợp hơn với. Để sử dụng listdir đây, nó sẽ trông như thế nào:
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))
files.sort(key=lambda fn: os.path.getmtime(os.path.join(search_dir, fn)))
files.sort(key=os.path.getmtime)
nên làm việc (không có lambda
).
Đây là phiên bản của tôi:
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
Đầu tiên, chúng tôi xây dựng một danh sách các tên tập tin. isfile () được sử dụng để bỏ qua các thư mục; nó có thể được bỏ qua nếu bao gồm các thư mục. Sau đó, chúng tôi sắp xếp danh sách tại chỗ, sử dụng ngày sửa đổi làm khóa.
a[-5:]
Đây là một lót:
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)])
Điều này gọi os.listdir () để lấy danh sách tên tệp, sau đó gọi os.stat () cho mỗi người để có thời gian tạo, sau đó sắp xếp theo thời gian tạo.
Lưu ý rằng phương thức này chỉ gọi os.stat () một lần cho mỗi tệp, sẽ hiệu quả hơn so với gọi nó cho mỗi so sánh trong một loại.
Không thay đổi thư mục:
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
Đây là câu trả lời của tôi bằng cách sử dụng global mà không có bộ lọc nếu bạn muốn đọc các tệp có phần mở rộng nhất định theo thứ tự ngày (Python 3).
dataset_path='/mydir/'
files = glob.glob(dataset_path+"/morepath/*.extension")
files.sort(key=os.path.getmtime)
# *** the shortest and best way ***
# getmtime --> sort by modified time
# getctime --> sort by created time
import glob,os
lst_files = glob.glob("*.txt")
lst_files.sort(key=os.path.getmtime)
print("\n".join(lst_files))
sorted(filter(os.path.isfile, os.listdir('.')),
key=lambda p: os.stat(p).st_mtime)
Bạn có thể sử dụng os.walk('.').next()[-1]
thay vì lọc với os.path.isfile
, nhưng điều đó để lại các liên kết chết trong danh sách và os.stat
sẽ thất bại với chúng.
đây là một bước cơ bản để tìm hiểu:
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
Câu trả lời của Alex Coventry sẽ tạo ra một ngoại lệ nếu tệp là liên kết tượng trưng đến tệp không tồn tại, đoạn mã sau sẽ sửa câu trả lời đó:
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())
Khi tệp không tồn tại, bây giờ () được sử dụng và liên kết tượng trưng sẽ ở cuối danh sách.
Dưới đây là một vài dòng đơn giản tìm kiếm sự kéo dài cũng như cung cấp tùy chọn sắp xếp
def get_sorted_files(src_dir, regex_ext='*', sort_reverse=False):
files_to_evaluate = [os.path.join(src_dir, f) for f in os.listdir(src_dir) if re.search(r'.*\.({})$'.format(regex_ext), f)]
files_to_evaluate.sort(key=os.path.getmtime, reverse=sort_reverse)
return files_to_evaluate
Đây là phiên bản của tôi:
import os
folder_path = r'D:\Movies\extra\new\dramas' # your path
os.chdir(folder_path) # make the path active
x = sorted(os.listdir(), key=os.path.getctime) # sorted using creation time
folder = 0
for folder in range(len(x)):
print(x[folder]) # print all the foldername inside the folder_path
folder = +1
Có lẽ bạn nên sử dụng lệnh shell. Trong Unix / Linux, tìm đường ống với sắp xếp có thể sẽ có thể làm những gì bạn muốn.