अजगर का उपयोग करके एक फ़ोल्डर में नवीनतम फ़ाइल कैसे प्राप्त करें


126

मुझे अजगर का उपयोग करके एक फ़ोल्डर की नवीनतम फ़ाइल प्राप्त करने की आवश्यकता है। कोड का उपयोग करते समय:

max(files, key = os.path.getctime)

मुझे नीचे त्रुटि मिल रही है:

FileNotFoundError: [WinError 2] The system cannot find the file specified: 'a'


2
आप किस फ़ाइल को खोजने की कोशिश कर रहे हैं? अपने संबंधित कोड को क्सेटिटोन में जोड़ें।
नईम उल वहाब

1
मैं अनुमान लगा रहा हूं कि यह आपके लिए काम क्यों नहीं कर सकता है: फ़ाइल नाम तत्वों या एकल फ़ाइल नाम स्ट्रिंग की सूची "फाइलें" है?
mpurg

जवाबों:


322

filesचर को जो भी सौंपा गया है वह गलत है। निम्नलिखित कोड का उपयोग करें।

import glob
import os

list_of_files = glob.glob('/path/to/folder/*') # * means all if need specific format then *.csv
latest_file = max(list_of_files, key=os.path.getctime)
print latest_file

4
क्या होगा अगर एक फ़ाइल के बजाय मैं नवीनतम बनाया / संशोधित फ़ोल्डर ढूंढना चाहता हूं?
लिंक

1
@ उसी कोड को उसके लिए काम करता है। अगर आप इसके फोल्डर को चेक करना चाहते हैं या नहीं तो आप चेक कर सकते हैंif os.path.isdir(latest_file):
Marlon Abeykoon

6
अजीब। मुझे नवीनतम फ़ाइल प्राप्त करने के लिए "मिनट" का उपयोग करना पड़ा। कुछ खोज के आसपास संकेत दिया कि यह ओएस विशिष्ट है।
ग्रेके

15
यह एक उत्कृष्ट उत्तर है - धन्यवाद! मुझे pathlib.Pathस्ट्रिंग्स और ओएस.पाथ से अधिक वस्तुओं के साथ काम करना पसंद है । Pathlib.Path ऑब्जेक्ट्स के साथ आपका उत्तर बन जाता है: list_of_paths = folder_path.glob('*'); latest_path = max(list_of_paths, key=lambda p: p.stat().st_ctime)
Phil

4
@ एफिल आप अभी भी os.path.getctimeकुंजी के रूप में उपयोग कर सकते हैं , यहां तक ​​कि Pathवस्तुओं के साथ भी ।
बेरीस्लाव लोपैक

42
max(files, key = os.path.getctime)

काफी अधूरा कोड है। क्या है files? यह संभवतः फ़ाइल नामों की एक सूची है, जिससे बाहर आ रहा है os.listdir()

लेकिन यह सूची केवल फ़ाइल नाम भागों (उर्फ "बेसनेम") को सूचीबद्ध करती है, क्योंकि उनका मार्ग सामान्य है। इसे सही तरीके से उपयोग करने के लिए, आपको इसे उस तक जाने वाले मार्ग के साथ जोड़ना होगा (और इसे प्राप्त करने के लिए उपयोग किया जाता है)।

जैसे कि (अप्राप्त):

def newest(path):
    files = os.listdir(path)
    paths = [os.path.join(path, basename) for basename in files]
    return max(paths, key=os.path.getctime)

मुझे यकीन है कि डाउनवोटर्स समझा सकते हैं कि वास्तव में क्या गलत है।
glglgl

3
Dunno, आप के लिए परीक्षण किया, यह काम करने लगता है। उसके ऊपर, आप केवल एक ही थे कि आप थोड़ा सा समझा सकें। स्वीकृत उत्तर को पढ़ने से मुझे लगता है कि 'ग्लोब' चीज़ की ज़रूरत थी, जबकि यह बिल्कुल नहीं है। धन्यवाद
अरनॉड पी

4
@ निश्चित रूप से। बस if basename.endswith('.csv')सूची समझ में डालें ।
Glglgl

1
@BreakBadSP यदि आप लचीलापन चाहते हैं, तो आप सही हैं। यदि आप एक निश्चित निर्देशिका तक ही सीमित हैं, तो मैं यह नहीं देखता कि कैसे आपका संभवतः अधिक कुशल हो सकता है। लेकिन कभी-कभी, दक्षता की तुलना में पठनीयता अधिक महत्वपूर्ण होती है, इसलिए आपका वास्तव में उस अर्थ में बेहतर हो सकता है।
ग्लोगल

1
इसके लिए धन्यवाद, मैंने अपने कई ETL फ़ंक्शंस में इसका इस्तेमाल किया है!
मैनाकिन

9

मैं glob.iglob()इसके बजाय उपयोग करने का सुझाव दूंगा glob.glob(), क्योंकि यह अधिक कुशल है।

glob.iglob () एक पुनरावृति लौटाएं जो ग्लोब () के समान मूल्य देता है, वास्तव में उन सभी को एक साथ संग्रहीत किए बिना।

जिसका अर्थ glob.iglob()अधिक कुशल होगा।

मैं अपने पैटर्न से मेल खाते नवीनतम फ़ाइल को खोजने के लिए ज्यादातर कोड का उपयोग करता हूं:

LatestFile = max(glob.iglob(fileNamePattern),key=os.path.getctime)


नोट: maxफ़ंक्शन के वेरिएंट हैं , नवीनतम फ़ाइल खोजने के मामले में हम नीचे दिए गए वेरिएंट का उपयोग करेंगे: max(iterable, *[, key, default])

जिसे पुनरावृत्ति की आवश्यकता है, इसलिए आपका पहला पैरामीटर पुनरावृत्त होना चाहिए। अधिकतम संख्या खोजने के मामले में हम बियो वेरिएंट का उपयोग कर सकते हैं:max (num1, num2, num3, *args[, key])


1
मुझे यह max()तरह पसंद है । मेरे मामले में, मैंने एक अलग प्रयोग किया key=os.path.basenameक्योंकि फ़ाइलनाम में टाइमस्टैम्प था।
MarkHu

4

निर्माण समय द्वारा आइटम सॉर्ट करने का प्रयास करें। नीचे दिए गए उदाहरण एक फ़ोल्डर में फ़ाइलों को टाइप करते हैं और पहला तत्व प्राप्त करते हैं जो नवीनतम है।

import glob
import os

files_path = os.path.join(folder, '*')
files = sorted(
    glob.iglob(files_path), key=os.path.getctime, reverse=True) 
print files[0]

4

मुझे टिप्पणी करने के लिए प्रतिष्ठा की कमी है, लेकिन मार्लोन एबेकोन्स की प्रतिक्रिया के कारण मेरे लिए सही परिणाम नहीं मिला। माइम का उपयोग करने के लिए हालांकि चाल है। (कुंजी = os.path.get m time))

import glob
import os

list_of_files = glob.glob('/path/to/folder/*') # * means all if need specific format then *.csv
latest_file = max(list_of_files, key=os.path.getmtime)
print latest_file

मुझे उस समस्या के दो उत्तर मिले:

अजगर os.path.getctime अधिकतम नहीं लौटता है अजगर के बीच अंतर


1

(उत्तर में सुधार के लिए संपादित)

पहले एक फ़ंक्शन get_latest_file को परिभाषित करें

def get_latest_file(path, *paths):
    fullpath = os.path.join(path, paths)
    ...
get_latest_file('example', 'files','randomtext011.*.txt')

तुम भी एक docstring का उपयोग कर सकते हैं!

def get_latest_file(path, *paths):
    """Returns the name of the latest (most recent) file 
    of the joined path(s)"""
    fullpath = os.path.join(path, *paths)

यदि आप पायथन 3 का उपयोग करते हैं , तो आप इसके बजाय इग्लोब का उपयोग कर सकते हैं ।

नवीनतम फ़ाइल का नाम वापस करने के लिए पूरा कोड:

def get_latest_file(path, *paths):
    """Returns the name of the latest (most recent) file 
    of the joined path(s)"""
    fullpath = os.path.join(path, *paths)
    files = glob.glob(fullpath)  # You may use iglob in Python3
    if not files:                # I prefer using the negation
        return None                      # because it behaves like a shortcut
    latest_file = max(files, key=os.path.getctime)
    _, filename = os.path.split(latest_file)
    return filename

JuniperAccessLog-standalone-FCL_VPNभाग कहाँ से मिला ?
9

यह विंडोज 10. के तहत 0 लंबाई फ़ाइलों पर विफल रहता है
सुपरडोपरेरो

1

मैंने उपरोक्त सुझावों का उपयोग करने की कोशिश की है और मेरा प्रोग्राम दुर्घटनाग्रस्त हो गया है, क्योंकि मुझे लगा कि मैं जिस फ़ाइल की पहचान करने की कोशिश कर रहा हूं उसका उपयोग किया गया था और जब 'os.path.getctime' का उपयोग करने की कोशिश की गई तो यह दुर्घटनाग्रस्त हो गया। आखिरकार मेरे लिए क्या काम किया गया:

    files_before = glob.glob(os.path.join(my_path,'*'))
    **code where new file is created**
    new_file = set(files_before).symmetric_difference(set(glob.glob(os.path.join(my_path,'*'))))

इस कोड को फ़ाइल के दो सेटों के बीच असामान्य वस्तु मिलती है, इसकी सूची सबसे सुरुचिपूर्ण नहीं है, और यदि एक ही समय में कई फाइलें बनाई जाती हैं, तो यह संभवत: स्थिर नहीं होगी।


1

खिड़कियों पर बहुत तेज़ विधि (0.05 s), एक बैट स्क्रिप्ट को कॉल करती है जो ऐसा करती है:

get_latest.bat

@echo off
for /f %%i in ('dir \\directory\in\question /b/a-d/od/t:c') do set LAST=%%i
%LAST%

\\directory\in\questionवह निर्देशिका कहां है जिसकी आप जांच करना चाहते हैं।

get_latest.py

from subprocess import Popen, PIPE
p = Popen("get_latest.bat", shell=True, stdout=PIPE,)
stdout, stderr = p.communicate()
print(stdout, stderr)

यदि यह पाता है कि एक फ़ाइल stdoutपथ है और stderrकोई नहीं है।

stdout.decode("utf-8").rstrip()फ़ाइल नाम के प्रयोग करने योग्य स्ट्रिंग प्रतिनिधित्व प्राप्त करने के लिए उपयोग करें ।


यह सुनिश्चित नहीं है कि यह वोटों को आकर्षित क्यों कर रहा है, उन लोगों के लिए जिन्हें इस कार्य को जल्दी से करने की आवश्यकता है यह सबसे तेज़ तरीका है जो मुझे मिल सकता है। और कभी-कभी यह बहुत जल्दी करना आवश्यक है।
ic_fl2

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

1
धन्यवाद मैं वास्तव में इस से बेहतर समाधान के साथ अधिक चिंतित हूं (जैसे कि तेजी से लेकिन शुद्ध अजगर) तो उम्मीद कर रहा था कि कोई उस पर विस्तार कर सकता है।
ic_fl2

2
क्षमा करें, लेकिन मुझे नीचा दिखाना पड़ा, और मैं आपको कारण बताने का शिष्टाचार दूंगा। सबसे बड़ा कारण यह है कि यह अजगर का उपयोग नहीं कर रहा है (क्रॉस-प्लेटफॉर्म नहीं) इस प्रकार टूट गया है जब तक कि विंडोज के नीचे नहीं चलाया जाता। दूसरे, यह एक "तेज विधि" नहीं है (जब तक कि तेज का मतलब त्वरित-और-गंदा-नहीं-परेशान-से-पढ़ने के लिए डॉक्स है) - किसी अन्य स्क्रिप्ट से बाहर निकलना बेहद धीमा है।
MarkHu

1
@MarkHu वास्तव में यह स्क्रिप्ट एक अजगर की स्क्रिप्ट से एक बड़े फ़ोल्डर की सामग्री को जल्दी से जांचने की आवश्यकता से बाहर पैदा हुई थी। तो इस मामले में तेजी से विधि का मतलब है, सबसे तेजी से (या एक शुद्ध अजगर विधि की तुलना में तेज) नवीनतम फ़ोल्डर का फ़ाइल नाम मिलता है। लिनेक्स के लिए एक समान स्क्रिप्ट जोड़ने के लिए स्वतंत्र महसूस करें, शायद आधारित है ls -Art | tail -n 1। कृपया इसके बारे में दावे करने से पहले किसी समाधान के प्रदर्शन का मूल्यांकन करें।
ic_fl2

0

मैं इसे पायथन 3 में उपयोग कर रहा हूं, जिसमें फाइलनाम पर पैटर्न मिलान भी शामिल है।

from pathlib import Path

def latest_file(path: Path, pattern: str = "*"):
    files = path.glob(pattern)
    return max(files, key=lambda x: x.stat().st_ctime)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.