Os.listdir () का उपयोग करके छिपी हुई फ़ाइलों की उपेक्षा कैसे करें?


88

मेरी पाइथन लिपि क्रियान्वित होती है os.listdir(path)जहाँ पथ एक कतार है जिसमें अभिलेख हैं जिन्हें मुझे एक-एक करके इलाज करने की आवश्यकता है।

समस्या यह है कि मैं एक सरणी में सूची प्राप्त कर रहा हूं और फिर मैं केवल एक सरल कार्य करता हूं array.pop(0)। यह ठीक काम कर रहा था जब तक कि मैं इस परियोजना को तोड़फोड़ में न डालूँ। अब मुझे .svnअपने सरणी में फ़ोल्डर मिल गया है और निश्चित रूप से यह मेरे एप्लिकेशन को क्रैश बनाता है।

तो यहाँ मेरा सवाल है: क्या कोई ऐसा फ़ंक्शन है जो किसी को निष्पादित करते समय छिपी हुई फ़ाइलों की उपेक्षा करता है os.listdir()और यदि नहीं तो सबसे अच्छा तरीका क्या होगा?


तुम भी साथ फ़ोल्डर्स से बचने के लिए चाहते हो सकता हैos.path.isdir()
HashRocketSyntax

जवाबों:


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, '*'))

या तो इनमें से शुरू होने वाले सभी फ़ाइलनामों को अनदेखा कर दिया जाएगा '.'


1
प्रस्तावित फ़ंक्शन listdir_nohiddenके साथ काफी संगत नहीं है os.listdir, क्योंकि इसका उपयोग yieldइसे जनरेटर बनाता है। इसके बजाय इसे आउटपुट लिस्ट से भागना चाहिए os.listdirऔर 'से शुरू होने वाली प्रविष्टियों को हटा देना चाहिए ।'
मिलो विन्डोंडेक

3
@ 0sh: इसमें चीजों को अंदर-बाहर करना क्यों पड़ता है? बस एक नए फ़ंक्शन को परिभाषित करता है जो करता है list(listdir_nohidden(path))और वह नया फ़ंक्शन बिल्कुल संगत है os.listdir
23

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

5
key=lambda f: f.lower(): लैम्ब्डा बिना लिखा जा सकता हैkey=str.lower
जीन फ़्राँस्वा Fabre

2
दोनों को मिलाने के लिए: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

2
एक मैक पर भी काम करना चाहिए, छिपी हुई फाइलें वहां से शुरू होती हैं '।' भी।
वीराना हन्सचमिड

2
यह एकमात्र पोर्टेबल उत्तर है, बहुत अच्छा काम है, लेकिन अन्य उत्तर 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उपयोग करने का दावा करता है, लेकिन यह एक अग्रणी के लिए भी जांच करता है , उपयोग करके नहीं ।)listdirfnmatch'.'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('*')

यह केवल तभी काम करता है जब आपके पास एक छिपी हुई फ़ाइल होती है, और आप इसका नाम जानते हैं। क्या होगा यदि निर्देशिका में दर्जनों छिपी हुई फाइलें हैं, जिनमें मनमाने नाम नहीं हैं जिन्हें आप पहले से नहीं जान सकते हैं?
FeRD

हाय @FeRD, हाँ। जब मैं बैच / बैकलॉग प्रोसेसिंग मैक पर कर रहा होता हूं, तो मैं सभी फाइलों को नए फोल्डर में डाल देता हूं और .DS_Storeअपने आप बन जाता हूं । जब मैं सभी फ़ाइलों को ज़िप करता हूं और इसे सर्वर पर धकेलता हूं तो यह .DS_Storeभी जुड़ जाता है। यदि विभिन्न छिपी हुई फाइलें हैं, तो आप कोशिश कर सकते हैंos.system('ls -1')
उपयोगकर्ता 923227

क्रॉस-प्लेटफ़ॉर्म नहीं। os.popen('ls -1').read()विंडोज पर काम नहीं करेगा। की पूरी बात है os.listdir()
FeRD

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.