Os.listdir () ব্যবহার করে কীভাবে লুকানো ফাইলগুলি উপেক্ষা করবেন?


88

আমার অজগর স্ক্রিপ্টটি os.listdir(path)এমন একটিকে কার্যকর করে যেখানে পাথটি আর্কাইভযুক্ত একটি সারি যেখানে আমার একে একে চিকিত্সা করা দরকার।

সমস্যাটি হ'ল আমি একটি অ্যারেতে তালিকাটি পাচ্ছি এবং তারপরে আমি কেবল একটি সাধারণ কাজ করি array.pop(0)। আমি প্রকল্পটি সাবস্ট্রেশন না করা পর্যন্ত এটি কাজ করে চলেছিল। এখন আমি .svnআমার অ্যারেতে ফোল্ডারটি পেয়েছি এবং অবশ্যই এটি আমার অ্যাপ্লিকেশনটিকে ক্র্যাশ করে।

সুতরাং এখানে আমার প্রশ্ন: একটি ফাংশন আছে যা কোনও কার্যকর করার সময় লুকানো ফাইলগুলিকে উপেক্ষা করে os.listdir()এবং যদি না হয় তবে সবচেয়ে ভাল উপায় কী হবে?


আপনি ফোল্ডারগুলি এড়াতে os.path.isdir()
চাইতেও

উত্তর:


103

আপনি নিজে একটি লিখতে পারেন:

def listdir_nohidden(path):
    for f in os.listdir(path):
        if not f.startswith('.'):
            yield f

অথবা আপনি একটি গ্লোব ব্যবহার করতে পারেন :

def listdir_nohidden(path):
    return glob.glob(os.path.join(path, '*'))

এর মধ্যে যে কোনওটি দিয়ে শুরু হওয়া সমস্ত ফাইল নাম উপেক্ষা করবে '.'


4
প্রস্তাবিত ফাংশনটি listdir_nohiddenএকেবারে সামঞ্জস্যপূর্ণ নয় os.listdir, যেহেতু yieldএটির ব্যবহারটি এটি একটি জেনারেটর করে। পরিবর্তে এটি 'থেকে os.listdirশুরু হওয়া এন্ট্রিগুলি থেকে আউটপুট তালিকার মধ্য দিয়ে চলতে হবে এবং এন্ট্রিগুলি সরিয়ে নেওয়া উচিত ।
মিলো উইলোনডেক

4
@ ০ শ: এটি কেন স্থানের জিনিসগুলি সরিয়ে ফেলতে হবে? কেবল একটি নতুন ফাংশনটি সংজ্ঞায়িত করুন যা করে list(listdir_nohidden(path))এবং সেই নতুন ফাংশনটি হুবহু সামঞ্জস্যপূর্ণ os.listdir
abarnert

50

এটি একটি পুরানো প্রশ্ন, তবে মনে হচ্ছে এটি তালিকার বোধগম্যতার সুস্পষ্ট উত্তরটি অনুপস্থিত, সুতরাং আমি এখানে এটি সম্পূর্ণতার জন্য যুক্ত করছি:

[f for f in os.listdir(path) if not f.startswith('.')]

পার্শ্ব নোট হিসাবে, ডক্স রাজ্যটি listdir'স্বেচ্ছাসেবী আদেশে' ফলাফল দেয় তবে একটি সাধারণ ব্যবহারের ক্ষেত্রে তাদের বর্ণমালা অনুসারে বাছাই করা হয়। আপনি যদি মূল বিষয়বস্তু সম্পর্কিত নির্দেশনা বাদ দিয়ে ডিরেক্টরি বিষয়বস্তু বর্ণমালা অনুসারে বাছাই করতে চান তবে আপনি ব্যবহার করতে পারেন:

sorted([f for f in os.listdir('./')], key=lambda f: f.lower())

4
key=lambda f: f.lower()ল্যাম্বডা ছাড়াই লেখা যেতে পারে:key=str.lower
জিন-ফ্রান্সোয়েস ফ্যাব্রে

4
উভয়কে একত্রিত করতে:sorted([f for f in os.listdir('./') if not f.startswith('.')], key=str.lower)
রবার্ট

19

উইন্ডোজ, লিনাক্স এবং ওএস এক্স এ:

if os.name == 'nt':
    import win32api, win32con


def folder_is_hidden(p):
    if os.name== 'nt':
        attribute = win32api.GetFileAttributes(p)
        return attribute & (win32con.FILE_ATTRIBUTE_HIDDEN | win32con.FILE_ATTRIBUTE_SYSTEM)
    else:
        return p.startswith('.') #linux-osx

4
একটি ম্যাকের জন্যও কাজ করা উচিত, লুকানো ফাইলগুলি এখানে 'দিয়ে শুরু করা উচিত। যেমন.
ভেরেনা হানস্মমিড

4
এটি কেবলমাত্র পোর্টেবল উত্তর, মহান পেশা, তবে অন্যান্য উত্তর যাতে os.listdir জন্য একটি পূর্ণ মোড়কের প্রদান ...[f for f in os.listdir(path) if not folder_is_hidden(f)]
SensorSmith

15

জোশমেকার আপনার প্রশ্নের সঠিক সমাধান আছে।
Os.listdir () ব্যবহার করে কীভাবে লুকানো ফাইলগুলি উপেক্ষা করবেন?

পাইথন 3 এ তবে ওএসের পরিবর্তে প্যাথলিব ব্যবহার করার পরামর্শ দেওয়া হয়।

from pathlib import Path 
visible_files = [
    file for file in Path(".").iterdir() if not file.name.startswith(".")
]

14

গ্লোব :

>>> import glob
>>> glob.glob('*')

( globদাবী ব্যবহার listdirএবং fnmatchহুডের নীচে, তবে এটি কোনও নেতৃত্বের জন্যও পরীক্ষা '.'করে, ব্যবহার না করে fnmatch)


6

আমি মনে করি একটি লুপের সমস্ত আইটেমের মধ্য দিয়ে যাওয়া খুব বেশি কাজ। আমি এর মতো সহজ কিছু পছন্দ করবো:

lst = os.listdir(path)
if '.DS_Store' in lst:
    lst.remove('.DS_Store')

ডিরেক্টরিতে যদি একাধিক লুকানো ফাইল থাকে তবে এটি সহায়তা করতে পারে:

all_files = os.popen('ls -1').read()
lst = all_files.split('\n')

প্ল্যাটফর্মের স্বাধীনতার জন্য @ জোশ উল্লেখ করেছেন যে গ্লোব ভাল কাজ করে:

import glob
glob.glob('*')

এটি কেবলমাত্র যদি আপনার একটি লুকানো ফাইল থাকে এবং এটির নামটি জানেন তবেই এটি কাজ করে। ডিরেক্টরিটিতে যদি আপনি আগে থেকে জানতে না পারেন এমন স্বেচ্ছাসেবী নাম সহ কয়েক ডজন গোপন ফাইল রয়েছে?
21'19

হাই @FERD, হ্যাঁ আমি যখন ম্যাকটিতে ব্যাচ / ব্যাকলগ প্রসেসিং করছি, আমি সমস্ত ফাইল নতুন ফোল্ডারে রেখে দিচ্ছি এবং .DS_Storeস্বয়ংক্রিয়ভাবে তৈরি হয়ে যাব । আমি যখন সমস্ত ফাইল জিপ করে সার্ভারে চাপ দিই তখন .DS_Storeযুক্ত হয়ে যায়। যদি বিভিন্ন লুকানো ফাইল থাকে তবে আপনি চেষ্টা করতে পারেনos.system('ls -1')
ব্যবহারকারী 923227

ক্রস প্ল্যাটফর্ম নয়। os.popen('ls -1').read()উইন্ডোজ কাজ করবে না। যে সমগ্র বিন্দু os.listdir()
এফআরডি

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