फ़ाइलों को केवल वर्तमान निर्देशिका में सूचीबद्ध करें


225

पायथन में, मैं केवल वर्तमान निर्देशिका में सभी फाइलों को केवल सूचीबद्ध करना चाहता हूं। मुझे किसी उप निर्देशिका या माता-पिता से सूचीबद्ध फाइलें नहीं चाहिए।

वहाँ भी इसी तरह के समाधान लगते हैं, लेकिन वे मेरे लिए काम नहीं करते हैं। यहाँ मेरा कोड स्निपेट है:

import os
for subdir, dirs, files in os.walk('./'):
    for file in files:
      do some stuff
      print file

मान लीजिए कि मेरे पास मेरी वर्तमान निर्देशिका के अंदर 2 फाइलें, sacgrail.py और टिम हैं। मेरे पास एक फ़ोल्डर भी है और इसमें दो फाइलें हैं - चलो उन्हें आर्थर और लैंसलॉट कहते हैं - इसके अंदर। जब मैं स्क्रिप्ट चलाता हूं, तो मुझे यही मिलता है:

holygrail.py
Tim
Arthur
Lancelot

मैं पवित्रग्रैफिक्सो और टिम से खुश हूं। लेकिन दो फाइलें, आर्थर और लैंसलॉट, मुझे सूचीबद्ध नहीं चाहिए।

जवाबों:


378

बस का उपयोग करें os.listdirऔर os.path.isfileइसके बजाय os.walk

उदाहरण:

import os
files = [f for f in os.listdir('.') if os.path.isfile(f)]
for f in files:
    # do something

लेकिन अन्य निर्देशिका के लिए इसे लागू करते समय सावधान रहें, जैसे

files = [f for f in os.listdir(somedir) if os.path.isfile(f)].

जो काम नहीं करेगा क्योंकि fवर्तमान डायर के सापेक्ष पूर्ण पथ नहीं है।

इसलिए, किसी अन्य निर्देशिका पर फ़िल्टर करने के लिए, करें os.path.isfile(os.path.join(somedir, f))

( संकेत के लिए धन्यवाद कारण )


3
यह वही है जो मुझे अंत में चाहिए था[os.path.join(path_base,f) for f in os.listdir(path_base) if os.path.isfile(os.path.join(path_base,f))]
शहरनर्मन

2
यह उसका जवाब है: files = [f for f in os.listdir("/somedir") if os.path.isfile(os.path.join("/somedir", f))]'
जेफ ल्यूयट

64

आप os.listdirइस उद्देश्य के लिए उपयोग कर सकते हैं । यदि आप केवल फाइलें चाहते हैं और निर्देशिका नहीं , तो आप परिणामों का उपयोग करके फ़िल्टर कर सकते हैं os.path.isfile

उदाहरण:

files = os.listdir(os.curdir)  #files and directories

या

files = filter(os.path.isfile, os.listdir( os.curdir ) )  # files only
files = [ f for f in os.listdir( os.curdir ) if os.path.isfile(f) ] #list comprehension version.

20
import os

destdir = '/var/tmp/testdir'

files = [ f for f in os.listdir(destdir) if os.path.isfile(os.path.join(destdir,f)) ]

3
सामान्य समाधान देने के लिए धन्यवाद (उस मामले में जहां डिर cwd नहीं है)।
jwg

10

आप उपयोग कर सकते हैं os.scandir()। Stdlib में नया कार्य पायथन 3.5 से शुरू होता है।

import os

for entry in os.scandir('.'):
    if entry.is_file():
        print(entry.name)

से भी तेज os.listdir()os.walk() लागू होता है os.scandir()


5

यह os.walk () के साथ किया जा सकता है

अजगर 3.5.2 परीक्षण किया गया;

import os
for root, dirs, files in os.walk('.', topdown=True):
    dirs.clear() #with topdown true, this will prevent walk from going into subs
    for file in files:
      #do some stuff
      print(file)

dirs.clear () लाइन को हटा दें और उप फ़ोल्डरों की फाइलों को फिर से शामिल किया गया है।

संदर्भ के साथ अद्यतन ;

os.walk ने यहां दस्तावेज बनाए और ट्रिपल लिस्ट और टॉपडाउन इफेक्ट के बारे में बात की।

.clear () एक सूची खाली करने के लिए यहां प्रलेखित है

तो os.walk से संबंधित सूची को साफ करके आप अपनी आवश्यकताओं के लिए इसके परिणाम को प्रभावित कर सकते हैं।


4
import os
for subdir, dirs, files in os.walk('./'):
    for file in files:
      do some stuff
      print file

आप इस कोड को बेहतर बना सकते हैं del dirs[:]जिसके साथ निम्नलिखित जैसा होगा।

import os
for subdir, dirs, files in os.walk('./'):
    del dirs[:]
    for file in files:
      do some stuff
      print file

या इससे भी बेहतर अगर आप वर्तमान कामकाजी निर्देशिका के साथ os.walk को इंगित कर सकते हैं।

import os
cwd = os.getcwd()
for subdir, dirs, files in os.walk(cwd, topdown=True):
    del dirs[:]  # remove the sub directories.
    for file in files:
      do some stuff
      print file


1

आप पाथलिब मॉड्यूल का उपयोग कर सकते हैं।

from pathlib import Path
x = Path('./')
print(list(filter(lambda y:y.is_file(), x.iterdir())))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.