मुझे अजगर का उपयोग करके एक फ़ोल्डर की नवीनतम फ़ाइल प्राप्त करने की आवश्यकता है। कोड का उपयोग करते समय:
max(files, key = os.path.getctime)
मुझे नीचे त्रुटि मिल रही है:
FileNotFoundError: [WinError 2] The system cannot find the file specified: 'a'
मुझे अजगर का उपयोग करके एक फ़ोल्डर की नवीनतम फ़ाइल प्राप्त करने की आवश्यकता है। कोड का उपयोग करते समय:
max(files, key = os.path.getctime)
मुझे नीचे त्रुटि मिल रही है:
FileNotFoundError: [WinError 2] The system cannot find the file specified: 'a'
जवाबों:
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
if os.path.isdir(latest_file):
pathlib.Pathस्ट्रिंग्स और ओएस.पाथ से अधिक वस्तुओं के साथ काम करना पसंद है । Pathlib.Path ऑब्जेक्ट्स के साथ आपका उत्तर बन जाता है: list_of_paths = folder_path.glob('*'); latest_path = max(list_of_paths, key=lambda p: p.stat().st_ctime)
os.path.getctimeकुंजी के रूप में उपयोग कर सकते हैं , यहां तक कि Pathवस्तुओं के साथ भी ।
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)
if basename.endswith('.csv')सूची समझ में डालें ।
मैं 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])
max()तरह पसंद है । मेरे मामले में, मैंने एक अलग प्रयोग किया key=os.path.basenameक्योंकि फ़ाइलनाम में टाइमस्टैम्प था।
निर्माण समय द्वारा आइटम सॉर्ट करने का प्रयास करें। नीचे दिए गए उदाहरण एक फ़ोल्डर में फ़ाइलों को टाइप करते हैं और पहला तत्व प्राप्त करते हैं जो नवीनतम है।
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]
मुझे टिप्पणी करने के लिए प्रतिष्ठा की कमी है, लेकिन मार्लोन एबेकोन्स की प्रतिक्रिया के कारण मेरे लिए सही परिणाम नहीं मिला। माइम का उपयोग करने के लिए हालांकि चाल है। (कुंजी = 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
मुझे उस समस्या के दो उत्तर मिले:
(उत्तर में सुधार के लिए संपादित)
पहले एक फ़ंक्शन 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भाग कहाँ से मिला ?
मैंने उपरोक्त सुझावों का उपयोग करने की कोशिश की है और मेरा प्रोग्राम दुर्घटनाग्रस्त हो गया है, क्योंकि मुझे लगा कि मैं जिस फ़ाइल की पहचान करने की कोशिश कर रहा हूं उसका उपयोग किया गया था और जब '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,'*'))))
इस कोड को फ़ाइल के दो सेटों के बीच असामान्य वस्तु मिलती है, इसकी सूची सबसे सुरुचिपूर्ण नहीं है, और यदि एक ही समय में कई फाइलें बनाई जाती हैं, तो यह संभवत: स्थिर नहीं होगी।
खिड़कियों पर बहुत तेज़ विधि (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()फ़ाइल नाम के प्रयोग करने योग्य स्ट्रिंग प्रतिनिधित्व प्राप्त करने के लिए उपयोग करें ।
ls -Art | tail -n 1। कृपया इसके बारे में दावे करने से पहले किसी समाधान के प्रदर्शन का मूल्यांकन करें।