كيف يمكنك الحصول على دليل الإدراج مرتبة حسب تاريخ الإنشاء في بيثون؟

StackOverflow https://stackoverflow.com/questions/168409

  •  03-07-2019
  •  | 
  •  

سؤال

ما هي أفضل طريقة للحصول على قائمة من كافة الملفات في دليل، مرتبة حسب التاريخ [خلق | تعديل]، وذلك باستخدام بيثون، على جهاز ويندوز؟

هل كانت مفيدة؟

المحلول

وهنا نسخة أكثر مطول <لأ href = "https://stackoverflow.com/questions/168409/how-do-you-get-a-directory-listing-sorted-by-creation-date-in- الثعبان / 168435 # 168435 "> @Greg Hewgill في الإجابة . وهي أكثر المطابقة لمتطلبات السؤال. فإنه يجعل التمييز بين إنشاء وتعديل مواعيد (على الأقل على ويندوز).

#!/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

نصائح أخرى

ولقد فعلت ذلك في الماضي لبيثون السيناريو لتحديد الملفات التي تم تحديثها مشاركة في الدليل:

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 () إذا رغبت في ذلك - والسبب كنت غلوب في قانون بلدي الأصلي كان أن الأول كان يريد استخدام غلوب فقط للبحث عن الملفات مع مجموعة معينة من ملحقات الملفات، التي غلوب () كان أكثر ملاءمة ل. لاستخدام 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))

إليك روايتي:

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 () لتخطي الدلائل. يمكن إغفالها إذا كان ينبغي أن تدرج الدلائل. ثم، ونحن فرز قائمة في نفس المكان، وذلك باستخدام تاريخ تعديل كمفتاح.

وهناك وظيفة os.path.getmtime الذي يعطي عدد الثواني منذ عهد وينبغي أن يكون أسرع من os.stat.

import os 

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

وفيما يلى مجموعة من الخطوط الملاحية المنتظمة واحد:

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 () مرة واحدة لكل ملف، والتي سوف تكون أكثر كفاءة من اصفا اياه لكل المقارنة في نوع.

ودون تغيير الدليل:

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

وهنا جوابي باستخدام غلوب بدون فلتر إذا كنت ترغب في قراءة ملفات بملحق معين من أجل التاريخ (بيثون 3).

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

في بيثون 3.5 +

from pathlib import Path
sorted(Path('.').iterdir(), key=lambda f: f.stat().st_mtime)
sorted(filter(os.path.isfile, os.listdir('.')), 
    key=lambda p: os.stat(p).st_mtime)

هل يمكن استخدام os.walk('.').next()[-1] بدلا من تصفية مع os.path.isfile، ولكن هذا يترك روابط الرمزية القتلى في القائمة، وستفشل os.stat عليها.

وهذا هو خطوة أساسية للتعلم:

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
والجواب

وأليكس كوفنتري تنتج استثناء إذا كان الملف هو الارتباط الرمزي إلى ملف unexistent، التعليمة البرمجية التالية بتصحيح هذا الجواب:

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

عند عدم وجود الملف، الآن () يستخدم، وسوف الرمزي تذهب في النهاية من القائمة.

وهنا هو بسيط بضعة خطوط التي تبدو لتمديد فضلا عن توفر خيار الفرز

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

وربما يجب عليك استخدام الأوامر قذيفة. في يونيكس / لينكس، والعثور على بالأنابيب مع نوع من المحتمل أن يكون قادرا على فعل ما تريد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top