পাইথন ব্যবহার করে ফোল্ডারে কীভাবে সর্বশেষতম ফাইল পাবেন


126

পাইথন ব্যবহার করে আমার ফোল্ডারের সর্বশেষ ফাইলটি পাওয়া উচিত। কোডটি ব্যবহার করার সময়:

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

আমি নীচের ত্রুটি পাচ্ছি:

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


2
আপনি কোন ফাইলটি সন্ধান করার চেষ্টা করছেন? আপনার প্রাসঙ্গিক কোডটি ক্যোজিটনে যুক্ত করুন।
উল ওহাব

1
আমি অনুমান করছি কেন এটি আপনার পক্ষে কাজ করবে না: "ফাইলগুলি" ফাইল নাম উপাদানগুলির একটি তালিকা বা একটি একক ফাইলের নামের স্ট্রিং?
এমপুরগ

উত্তর:


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):
মারলন আবেইকুন

6
রহস্যময়। সর্বশেষ ফাইলটি পেতে আমাকে "মিনিট" ব্যবহার করতে হয়েছিল। কিছু লোক আশেপাশে অনুসন্ধান করেছিল যে এটি ওএস নির্দিষ্ট।
গ্রেইক

15
এটি একটি দুর্দান্ত উত্তর - আপনাকে ধন্যবাদ! আমি pathlib.Pathস্ট্রিং এবং ওএস.প্যাথের চেয়ে বেশি অবজেক্টের সাথে কাজ করতে চাই । পাথলিব.পথ অবজেক্টের সাথে আপনার উত্তর হয়ে যায়: list_of_paths = folder_path.glob('*'); latest_path = max(list_of_paths, key=lambda p: p.stat().st_ctime)
ফিল

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
ডুনো, আপনার জন্য পরীক্ষিত, এটি কাজ করে বলে মনে হচ্ছে। তারপরে, আপনি কেবলমাত্র কিছু ব্যাখ্যা করার জন্য যত্নশীল ছিলেন। গৃহীত উত্তরটি পড়ে আমার মনে হয়েছে যে 'গ্লোব' জিনিসটির প্রয়োজন ছিল, যদিও এটি একেবারেই নয়। ধন্যবাদ
আরনাউদ পি

4
@ ডেভিড অবশ্যই কেবল if basename.endswith('.csv')তালিকা বোধগম্য মধ্যে সন্নিবেশ করুন ।
glglgl

1
@ ব্র্যাকব্যাডএসপি যদি আপনি নমনীয়তা চান তবে আপনি ঠিক বলেছেন। আপনি যদি কোনও নির্দিষ্ট ডিরেক্টরিতে সীমাবদ্ধ থাকেন তবে কীভাবে আপনার সম্ভবত আরও দক্ষ হতে পারে তা আমি দেখতে পাচ্ছি না। তবে কখনও কখনও দক্ষতার চেয়ে পাঠযোগ্যতা বেশি গুরুত্বপূর্ণ, তাই আপনার দিক থেকে এটি সম্ভবত আরও ভাল।
glglgl

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ফাইলের নামগুলিতে টাইমস্ট্যাম্প থাকার কারণে আমি একটি আলাদা ব্যবহার করেছি।
মার্কহু

4

তৈরির সময় অনুসারে আইটেমগুলি বাছাই করার চেষ্টা করুন। নীচে উদাহরণস্বরূপ একটি ফোল্ডারে ফাইলগুলি বাছাই করে এবং প্রথম উপাদানটি পাওয়া যায় যা সর্বশেষ is

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 এম সময়))

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

আমি এই সমস্যার জন্য দুটি উত্তর পেয়েছি:

পাইথন ওস.পথ.জেটটাইম সর্বাধিক ফিরিয়ে দেয় না ইউনিক্স সিস্টেমে পাইথন - গেটমটাইম () এবং গেটকালটাইম () এর মধ্যে পার্থক্য


1

(উত্তরের উন্নতির জন্য সম্পাদিত)

প্রথমে get_latest_file একটি ফাংশন সংজ্ঞায়িত করুন

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

আপনি একটি ডাস্ট্রিং ব্যবহার করতে পারেন!

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থেকে অংশটি পেয়েছেন?
glglgl

এই উইন্ডোজ 10 বছরের কম 0 দৈর্ঘ্য ফাইল ব্যর্থ
Superdooperhero

1

আমি উপরের পরামর্শগুলি ব্যবহার করার চেষ্টা করেছি এবং আমার প্রোগ্রামটি ক্র্যাশ হয়েছিল, আমি যে ফাইলটি সনাক্ত করতে চাইছিলাম তা ব্যবহার করার পরে এবং 'os.path.getctime' ব্যবহার করার সময় এটি ক্র্যাশ হয়েছিল than অবশেষে আমার জন্য যা কাজ করেছিল তা হ'ল:

    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 সে), এমন একটি ব্যাট স্ক্রিপ্ট কল করুন যা এটি করে:

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()ফাইলের নামের ব্যবহারযোগ্য স্ট্রিং প্রতিনিধিত্ব পেতে ব্যবহার করুন ।


নিশ্চিত নয় যে এটি কীভাবে ভোটগুলিকে আকর্ষণ করে, তাদের পক্ষে এই কাজটি দ্রুত করা দরকার তাদের পক্ষে এটি আমার কাছে দ্রুততম পদ্ধতি find এবং কখনও কখনও এটি খুব দ্রুত করা প্রয়োজন।
ic_fl2

একটি upvote আছে। আমি এটি উইন্ডোতে করছি না, তবে আপনি যদি গতি খুঁজছেন, অন্য উত্তরগুলির জন্য একটি ডিরেক্টরিতে সমস্ত ফাইলের পুনরাবৃত্তি প্রয়োজন। সুতরাং যদি আপনার ওএসে শেল কমান্ডগুলি তালিকাবদ্ধ ফাইলগুলির একটি সাজানোর ক্রম নির্দিষ্ট করে তবে এটির প্রথম বা শেষ ফলাফলটি দ্রুত হওয়া উচিত
জিম হুনজিকার 18 ই

1
ধন্যবাদ আমি আসলে এর থেকে আরও ভাল সমাধানের সাথে আরও উদ্বিগ্ন (একইভাবে দ্রুত তবে খাঁটি অজগর হিসাবে) আশা করি কেউ এ সম্পর্কে বিস্তারিত বলতে পারে।
ic_fl2

2
দুঃখিত, তবে আমাকে হ্রাস করতে হয়েছিল, এবং এর কারণগুলি ব্যাখ্যা করার সৌজন্যে আপনাকে দেব। সর্বাধিক কারণ হ'ল উইন্ডোজ এর অধীনে না চললে এটি অজগর (ক্রস প্ল্যাটফর্ম নয়) ব্যবহার করছে না। দ্বিতীয়ত, এটি একটি "দ্রুত পদ্ধতি" নয় (যদি না দ্রুত মানে দ্রুত এবং ময়লা-বিরক্তিকর-থেকে-পড়ার-ডকসই না হয়) - অন্য স্ক্রিপ্টে শেলিং কুখ্যাতভাবে ধীর হয়।
মার্কহু

1
@ মারকহু আসলে অজগর স্ক্রিপ্ট থেকে দ্রুত একটি বৃহত ফোল্ডারের সামগ্রী চেক করার প্রয়োজনীয়তার কারণে এই স্ক্রিপ্টটির জন্ম হয়েছিল। সুতরাং এক্ষেত্রে দ্রুত পদ্ধতির অর্থ, দ্রুততম (বা খাঁটি অজগর পদ্ধতির চেয়ে দ্রুত) নতুন ফোল্ডারের ফাইলের নাম পাওয়া যায়। লিনাক্সের জন্য অনুরূপ স্ক্রিপ্ট যুক্ত করতে নির্দ্বিধায়, সম্ভবত উপর ভিত্তি করে ls -Art | tail -n 1। কোনও দাবী করার আগে দয়া করে কোনও সমাধানের কার্যকারিতা মূল্যায়ন করুন ate
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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.