পাইথনে আপনি কীভাবে তৈরি করতে পারেন ডিরেক্টরি তৈরির তারিখ অনুসারে?


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
এটি পুরোপুরি কাজ করে। আমি দুটি ডিরেক্টরি সিডিট একে অপরের সাথে তুলনা করার চেষ্টা করছি। দুটি সিডেটের মধ্যে সেকেন্ডের তুলনা করার কোনও উপায় আছে কি?
ফেদেরার

@ লম্বা সিএমসিএমসিএমুল: যুগের cdateপর থেকে কয়েক সেকেন্ডের ভাসমান সংখ্যা।
jfs

4
এই কাজ কিন্তু অধিকাংশ সংক্ষিপ্ত সমাধান হয় stackoverflow.com/a/4500607/68534
jmoz

@jmoz: আপনি ভালো মানে কি এই । আপনার লিঙ্কযুক্ত সমাধানটি ভুল: এটি নিয়মিত ফাইলগুলি ফিল্টার করে না। দ্রষ্টব্য: আমার সমাধান statএকবার dir.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))

ফাইল এমটাইমের ভিত্তিতে আপনি যা খুঁজছেন তা করা উচিত।

সম্পাদনা : দ্রষ্টব্য যে আপনি যদি 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: ফাইলসসোর্ট (ল্যাম্বদা এক্স, ওয়াই: সিএমপি (os.path.getmtime (os.path.join (অনুসন্ধান_ডির, এক্স)), OS.path.getmime (ওএস অনুপস্থিত .path.join (অনুসন্ধান_দির, y))))
পিটার হফম্যান

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

22
একটি নিছক files.sort(key=os.path.getmtime)কাজ করা উচিত (ছাড়া lambda)।
jfs

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 () কল করে, যা প্রতিটি তুলনার জন্য এইটিকে কল করার চেয়ে আরও কার্যকর হবে sort


এটি খুব কমই অজগর, যদিও এটি কাজটি সমাধান করে (অস্বীকৃতি: কোডটি পরীক্ষা করেনি)।
অ্যাড্রিয়ানো ভারোলি পিয়াজা 19

এই সমাধানটি তালিকা থেকে ডায়ারকে বাদ দেয় না।
কনস্টান্টিন

@ কনস্ট্যান্টিন: এটি সত্য, তবে দ্রুত [... যদি স্ট্যাটাস.এস_আইএসআরজি (এক্স)] তা পরিচালনা করতে পারে।
গ্রেগ হিউগিল

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পরিবর্তে ব্যবহার করুন।
অ্যালানজডস

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

দয়া করে প্রসঙ্গটি সরবরাহ করুন
ক্লেয়ার

"সেরা" বিষয়গত হয়। আপনার উত্তরটি আরও ভাল হবে যদি আপনি ব্যাখ্যা করেন যে আপনি কেন এটি সবচেয়ে ভাল উপায়।
ব্রায়ান ওকলে

আপনি যদি "সেরা" চান তবে আপনি অবশ্যই গ্লোব ব্যবহার করবেন না, কারণ এটি সত্যই ধীর।
ব্যবহারকারী 136036

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)

যেখানে মি টাইম পরিবর্তিত সময়।


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, বিপরীত = সত্য)
হকরাফিউল

-6

আপনার শেল কমান্ড ব্যবহার করা উচিত। ইউনিক্স / লিনাক্সে, সাজানোর সাথে পাইপযুক্ত সন্ধান করুন সম্ভবত আপনি যা চান তা করতে সক্ষম হবেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.