Làm thế nào để bạn có được một danh sách thư mục được sắp xếp theo ngày tạo trong python?


129

Cách tốt nhất để có được danh sách tất cả các tệp trong một thư mục, được sắp xếp theo ngày [tạo | sửa đổi], sử dụng python, trên máy tính windows?

Câu trả lời:


79

Cập nhật : để sắp xếp dirpathcá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 globnhư 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 Hewgillcủ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

1
Điều này làm việc hoàn hảo. Tôi đang cố gắng so sánh hai thư mục cdate với nhau. Có cách nào để so sánh giây giữa hai cdate không?
Federer

@malcmcmul: cdatelà số giây trôi nổi kể từ Epoch.
JFS

4
Điều này hoạt động nhưng giải pháp ngắn gọn nhất là tại stackoverflow.com/a/4500607/68534
jmoz

@jmoz: Ý anh là như này . Giải pháp bạn liên kết là sai: nó không lọc các tệp thông thường. Lưu ý: giải pháp của tôi gọi statmột lần mỗi dir.entry.
jfs

Hãy tha thứ cho tôi, liên kết được cung cấp bởi Sabastian thậm chí còn ngắn gọn hơn! Cảm ơn bạn.
jmoz

148

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

global () là tốt, nhưng hãy nhớ rằng nó bỏ qua các tệp bắt đầu bằng một khoảng thời gian. Các hệ thống * nix coi các tệp đó là ẩn (do đó bỏ qua chúng khỏi danh sách), nhưng trong Windows chúng là các tệp bình thường.
efotinis

Những giải pháp này không loại trừ dirs khỏi danh sách.
Constantin

Giải pháp os.listdir của bạn đang thiếu 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))))
Peter Hoffmann

files.sort(key=lambda fn: os.path.getmtime(os.path.join(search_dir, fn)))
jfs

22
Một chỉ files.sort(key=os.path.getmtime)nên làm việc (không có lambda).
jfs

31

Có một os.path.getmtimehàm cho số giây kể từ kỷ nguyên và nên nhanh hơn os.stat.

import os 

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

23

Đâ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.


Nó sắp xếp nó theo từ cũ nhất đến mới nhất. Khi tôi muốn có 5 tập tin mới nhất, tôi phải làm như saua[-5:]
Daniel Butler

20

Đâ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.


đó là hầu như không pythonic, mặc dù nó giải quyết công việc (từ chối trách nhiệm: đã không kiểm tra mã).
Quảng trường Adriano Varoli

Giải pháp này không loại trừ dirs khỏi danh sách.
Constantin

@Constantin: điều đó đúng, nhưng [... nếu stat.S_ISREG (x)] sẽ xử lý việc đó nhanh chóng.
Greg Hewgill

16

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

12

Trong trăn 3,5+

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

3
cho ngày tạo, sử dụng f.stat().st_ctimethay thế.
alanjds

11

Đâ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)

5
# *** 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))

vui lòng cung cấp ngữ cảnh
Claire

"tốt nhất" là chủ quan. Câu trả lời của bạn sẽ tốt hơn nếu bạn giải thích lý do tại sao bạn nghĩ đó là cách tốt nhất.
Bryan Oakley

Nếu bạn muốn "tốt nhất", bạn chắc chắn không sử dụng toàn cầu, vì nó rất chậm.
dùng136036

4
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.statsẽ thất bại với chúng.


4
from pathlib import Path
import os

sorted(Path('./').iterdir(), key=lambda t: t.stat().st_mtime)

hoặc là

sorted(Path('./').iterdir(), key=os.path.getmtime)

hoặc là

sorted(os.scandir('./'), key=lambda t: t.stat().st_mtime)

trong đó m thời gian được sửa đổi thời gian.


1

đâ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

1

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.


0

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

0

Để hoàn thiện với os.scandir(nhanh hơn 2 lần pathlib):

import os
sorted(os.scandir('/tmp/test'), key=lambda d: d.stat().st_mtime)

0

Đâ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

Trong mã của tôi, các tập tin được sắp xếp từ cũ nhất đến mới nhất. Để có được tên tệp hoặc thư mục mới nhất trước tiên, bạn cần thêm Reverse = True trong danh sách tệp (trong trường hợp của tôi là x). vì vậy, x =
sort (os.listdir

-6

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.