आप अजगर में निर्माण तिथि के अनुसार एक निर्देशिका सूची कैसे प्राप्त कर सकते हैं?


129

एक निर्देशिका में सभी फ़ाइलों की सूची प्राप्त करने का सबसे अच्छा तरीका क्या है, तिथि के अनुसार क्रमबद्ध [बनाया | संशोधित], एक विंडोज़ मशीन पर अजगर का उपयोग?

जवाबों:


79

अपडेट : dirpathपायथन 3 में संशोधन तिथि द्वारा प्रविष्टियों को क्रमबद्ध करना :

import os
from pathlib import Path

paths = sorted(Path(dirpath).iterdir(), key=os.path.getmtime)

( अधिक दृश्यता के लिए @ पायरेसी का जवाब यहां डालें )

यदि आपके पास पहले से ही फ़ाइलनामों की सूची है files, तो इसे विंडोज पर निर्माण समय के आधार पर सॉर्ट करने के लिए:

files.sort(key=os.path.getctime)

उदाहरण के लिए, आपके द्वारा प्राप्त फ़ाइलों की सूची, globजैसा कि @ जे के उत्तर में दिखाया गया है ।


वर्ष जवाब यहाँ के संस्करण वर्बोज़ एक और भी है @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

1
यह पूरी तरह से काम किया। मैं एक दूसरे के साथ दो निर्देशिकाओं की तुलना करने की कोशिश कर रहा हूं। क्या दो cdates के बीच सेकंड की तुलना करने का एक तरीका है?
फेडरर

@malcmcmul: एपोच के cdateबाद से कुछ सेकंड की फ्लोट संख्या है।
JFS

4
यह काम करता है लेकिन सबसे
सक्सेसफुल सॉल्यूशन

@jmoz: क्या आपका मतलब इस तरह है । आपके द्वारा लिंक किया गया समाधान गलत है: यह नियमित फ़ाइलों को फ़िल्टर नहीं करता है। नोट: मेरा समाधान statdir.entry के अनुसार एक बार कॉल करता है।
JFS

मुझे माफ कर दो, सबास्टियन द्वारा प्रदान किया गया लिंक और भी अधिक सफल है! धन्यवाद।
jmoz

148

मैंने एक निर्देशिका में अंतिम अद्यतन फ़ाइलों को निर्धारित करने के लिए पायथन स्क्रिप्ट के लिए अतीत में ऐसा किया है:

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

फाइल माइम के आधार पर आपको वही करना चाहिए जो आप देख रहे हैं।

EDIT : ध्यान दें कि आप glob.glob () के स्थान पर os.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))

ग्लोब () अच्छा है, लेकिन ध्यान रखें कि यह एक अवधि के साथ शुरू होने वाली फाइलों को छोड़ देता है। * निक्स सिस्टम इस तरह की फाइलों को छिपा हुआ मानते हैं (इस तरह उन्हें लिस्टिंग से छोड़ दिया जाता है), लेकिन विंडोज में वे सामान्य फाइलें हैं।
एफफोटिनिस

ये समाधान सूची से dirs को बाहर नहीं करते हैं।
कांस्टेंटिन

आपका os.listdir समाधान os.path.join को याद कर रहा है: files.sort (लैम्ब्डा x, y: cmp (os.path.getmtime (os.path.join) (search_dir, x), os.path.getmtime (os) .path.join (search_dir, y)))
पीटर हॉफमैन

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

22
एक मात्र files.sort(key=os.path.getmtime)(बिना lambda) काम करना चाहिए ।
जफ्स

31

एक os.path.getmtimeफ़ंक्शन है जो युग के बाद से सेकंड की संख्या देता है और इससे अधिक तेज होना चाहिए os.stat

import os 

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

23

यहाँ मेरा संस्करण है:

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 () का उपयोग निर्देशिकाओं को छोड़ने के लिए किया जाता है; यदि निर्देशिकाओं को शामिल किया जाना चाहिए तो इसे छोड़ा जा सकता है। फिर, हम सूची को इन-प्लेस में क्रमबद्ध करते हैं, कुंजी के रूप में संशोधित तिथि का उपयोग करते हुए।


इसने इसे सबसे पुराने पहले से सबसे नए तक क्रमबद्ध किया। जब मुझे 5 नई फाइलें चाहिए थीं, तो मुझे निम्न कार्य करना थाa[-5:]
डैनियल बटलर

20

यहाँ एक लाइनर है:

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 () को कॉल करती है, जो एक तरह से प्रत्येक तुलना के लिए इसे कॉल करने से अधिक कुशल होगी।


यह शायद ही pythonic है, हालांकि यह काम को हल करता है (अस्वीकरण: कोड का परीक्षण नहीं किया)।
एड्रियानो वरोली पियाज़ा

यह समाधान सूची से dirs को बाहर नहीं करता है।
कांस्टेंटिन

@ कॉन्स्टेंटिन: यह सच है, लेकिन एक त्वरित [... अगर स्टेट। SISREG (x)] वह संभाल लेगा।
ग्रेग हेविल

16

निर्देशिका बदलने के बिना:

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

अजगर 3.5+ में

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

3
निर्माण की तारीख के लिए, f.stat().st_ctimeइसके बजाय का उपयोग करें ।
alanjds

11

यहाँ मेरा जवाब है बिना फिल्टर के ग्लोब का उपयोग करना अगर आप डेट ऑर्डर (पायथन 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))

कृपया संदर्भ प्रदान करें
क्लेयर

"सर्वश्रेष्ठ" व्यक्तिपरक है। आपका उत्तर बेहतर होगा यदि आपने समझाया कि आपको क्यों लगता है कि यह सबसे अच्छा तरीका है।
ब्रायन ओकले

यदि आप "सर्वश्रेष्ठ" चाहते हैं, तो आप निश्चित रूप से ग्लोब का उपयोग नहीं करते हैं, क्योंकि यह वास्तव में धीमा है।
user136036

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उन पर विफल हो जाएगा।


4
from pathlib import Path
import os

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

या

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

या

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

जहाँ m समय संशोधित समय है।


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

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

जब फ़ाइल मौजूद नहीं है, तो अब () का उपयोग किया जाता है, और सूची के बहुत अंत में सिमलिंक जाएगा।


0

यहां एक सरल युगल लाइनें हैं जो एक्सटेंशन के लिए दिखता है और साथ ही एक सॉर्ट विकल्प भी प्रदान करता है

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

पूर्णता के साथ os.scandir(2x अधिक तेज़ी से pathlib):

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

0

यह मेरा संस्करण था:

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

मेरे कोड में फ़ाइलों को सबसे पुराने से नवीनतम के रूप में क्रमबद्ध किया गया है। सबसे पहले नए फ़ाइलनाम या फ़ोल्डर प्राप्त करने के लिए, आपको फ़ाइल सूची में रिवर्स = ट्रू जोड़ना होगा (मेरे मामले में यह x था)। हां, एक्स = क्रमबद्ध (os.listdir (), कुंजी = os.path.getctime, रिवर्स = सच)
haqrafiul

-6

शायद आपको शेल कमांड का उपयोग करना चाहिए। यूनिक्स / लिनक्स में, क्रमबद्ध रूप से पाई गई खोज करें, जो आप चाहते हैं वह करने में सक्षम होंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.