क्या पायथन में वर्तमान निर्देशिका में सभी उपनिर्देशिकाओं की सूची वापस करने का कोई तरीका है?
मुझे पता है कि आप फ़ाइलों के साथ ऐसा कर सकते हैं, लेकिन मुझे इसके बजाय निर्देशिकाओं की सूची प्राप्त करने की आवश्यकता है।
क्या पायथन में वर्तमान निर्देशिका में सभी उपनिर्देशिकाओं की सूची वापस करने का कोई तरीका है?
मुझे पता है कि आप फ़ाइलों के साथ ऐसा कर सकते हैं, लेकिन मुझे इसके बजाय निर्देशिकाओं की सूची प्राप्त करने की आवश्यकता है।
जवाबों:
क्या आपका मतलब है कि तत्काल उपनिर्देशिकाएं, या हर निर्देशिका पेड़ के नीचे है?
किसी भी तरह से, आप ऐसा करने के os.walk
लिए उपयोग कर सकते हैं :
os.walk(directory)
प्रत्येक उपनिर्देशिका के लिए एक tuple निकलेगा। 3-ट्यूपल में Ths पहली प्रविष्टि एक निर्देशिका नाम है, इसलिए
[x[0] for x in os.walk(directory)]
आपको सभी उपनिर्देशिकाएँ, पुनरावर्ती रूप से देनी चाहिए।
ध्यान दें कि टपल में दूसरी प्रविष्टि पहली स्थिति में प्रवेश की बाल निर्देशिकाओं की सूची है, इसलिए आप इसके बजाय इसका उपयोग कर सकते हैं, लेकिन यह आपको बहुत अधिक बचाने की संभावना नहीं है।
हालाँकि, आप इसका उपयोग सिर्फ आपको तत्काल बाल निर्देशिका देने के लिए कर सकते हैं:
next(os.walk('.'))[1]
या पहले से ही पोस्ट किए गए अन्य समाधानों का उपयोग करके देखें, os.listdir
और os.path.isdir
" पायथन में तत्काल सबडायरेक्टरीज़ को कैसे प्राप्त करें " सहित उन पर ।
os.walk('.').next()[1]
या os.walk('.').__next__()[1]
सीधे इस्तेमाल न करें । इसके बजाय, अंतर्निहित फ़ंक्शन का उपयोग करें next()
, जो कि पायथन 2 (डॉक देखें) और पायथन 3 (देखें डॉक) दोनों में उपलब्ध है । उदाहरण के लिए next(os.walk('.'))[1]
:।
os.walk('.').next()[1]
सीधे उपयोग करना क्यों बुरा है ?
iteraror.__next__()
एक आंतरिक विधि है और iterator.next()
उपयोग next()
PEP-3114 के अनुसार बिल्ट-इन में परिवर्तित किया जाना चाहिए । PEP-3114 देखें जिसे 2007 में मंजूरी दी गई थी।
os.walk
और os.listdir
+ os.path.isdir
समाधान: मैं बस 10,000 उपनिर्देशिका (नीचे पदानुक्रम में फ़ाइलों के लाखों लोगों के साथ) के साथ एक निर्देशिका पर परीक्षण किया और प्रदर्शन में अंतर बहुत मामूली हैं। os.walk
: "10 लूप्स, सर्वश्रेष्ठ 3: 44.6 मिसेक प्रति लूप" और os.listdir
+ os.path.isdir
: "10 लूप्स, बेस्ट ऑफ 3: 45.1
import os
d = '.'
[os.path.join(d, o) for o in os.listdir(d)
if os.path.isdir(os.path.join(d,o))]
os.path.join
पर o
पूर्ण पथ प्राप्त करने के लिए, नहीं तो isdir(0)
हमेशा अवास्तविक लौटाते हैं
os.path.join
दो बार कॉल करने से बचने के लिए , आप पहले शामिल हो सकते हैं और फिर सूची को फ़िल्टर कर सकते हैं os.path.isdir
: filter(os.path.isdir, [os.path.join(d, o) for o in os.listdir(d)])
आप बस इस्तेमाल कर सकते हैं glob.glob
from glob import glob
glob("/path/to/directory/*/")
के /
बाद अनुगामी मत भूलना *
।
/
नामों में अनुगामी छोड़ता है
/
फ़ोल्डर विभाजक होने का अनुमान नहीं लगा सकते हैं , तो ऐसा करें:glob(os.path.join(path_to_directory, "*", ""))
recursive=True
उपरोक्त की तुलना में बहुत अच्छा है, क्योंकि आपको कई os.path.join () की आवश्यकता नहीं है और आपको सीधे पूरा रास्ता मिल जाएगा (यदि आप चाहें), तो आप इसे पायथन 3.5 और इसके बाद के संस्करण में कर सकते हैं ।
subfolders = [ f.path for f in os.scandir(folder) if f.is_dir() ]
यह उपनिर्देशिका को पूरा रास्ता देगा। यदि आप f.name
इसके बजाय केवल उपनिर्देशिका का नाम चाहते हैंf.path
https://docs.python.org/3/library/os.html#os.scandir
थोड़ा सा OT: यदि आपको सभी सबफ़ोल्डर को पुनरावर्ती और / या सभी फ़ाइलों की पुनरावृत्ति की आवश्यकता है , तो इस फ़ंक्शन पर एक नज़र डालें, जो इससे अधिक तेज़ है os.walk
और glob
सभी सबफ़ोल्डर्स की सूची के साथ-साथ उन (उप) सबफ़ोल्डर्स के अंदर सभी फ़ाइलों को लौटाएगा: https://stackoverflow.com/a/59803793/2441026
मामले में आप केवल सभी सबफ़ोल्डर्स को पुनरावर्ती चाहते हैं :
def fast_scandir(dirname):
subfolders= [f.path for f in os.scandir(dirname) if f.is_dir()]
for dirname in list(subfolders):
subfolders.extend(fast_scandir(dirname))
return subfolders
अपने पूरे रास्तों के साथ सभी सबफ़ोल्डरों की सूची लौटाता है। यह फिर से तेज है os.walk
और बहुत तेजी से है glob
।
सभी कार्यों का विश्लेषण
tl; डॉ:
- यदि आप किसी फ़ोल्डर उपयोग के लिए सभी तत्काल उपनिर्देशिकाएँ प्राप्त करना चाहते हैं os.scandir
।
- यदि आप सभी उपनिर्देशिकाएँ प्राप्त करना चाहते हैं , यहां तक कि नेस्टेड वाले, उपयोग करें os.walk
या - थोड़ा तेज़ - fast_scandir
ऊपर फ़ंक्शन।
- कभी भी os.walk
केवल शीर्ष-स्तरीय उपनिर्देशिकाओं के लिए उपयोग न करें , क्योंकि यह सैकड़ों (!) की तुलना में धीमा हो सकता है os.scandir
।
os.walk
आधार फ़ोल्डर का पहला तत्व होगा। इसलिए आपको केवल उपनिर्देशिकाएँ नहीं मिलेंगी। आप fu.pop(0)
इसे हटाने के लिए उपयोग कर सकते हैं ।परिणाम :
os.scandir took 1 ms. Found dirs: 439
os.walk took 463 ms. Found dirs: 441 -> it found the nested one + base folder.
glob.glob took 20 ms. Found dirs: 439
pathlib.iterdir took 18 ms. Found dirs: 439
os.listdir took 18 ms. Found dirs: 439
W7x64, पायथन 3.8.1 के साथ परीक्षण किया गया।
# -*- coding: utf-8 -*-
# Python 3
import time
import os
from glob import glob
from pathlib import Path
directory = r"<insert_folder>"
RUNS = 1
def run_os_walk():
a = time.time_ns()
for i in range(RUNS):
fu = [x[0] for x in os.walk(directory)]
print(f"os.walk\t\t\ttook {(time.time_ns() - a) / 1000 / 1000 / RUNS:.0f} ms. Found dirs: {len(fu)}")
def run_glob():
a = time.time_ns()
for i in range(RUNS):
fu = glob(directory + "/*/")
print(f"glob.glob\t\ttook {(time.time_ns() - a) / 1000 / 1000 / RUNS:.0f} ms. Found dirs: {len(fu)}")
def run_pathlib_iterdir():
a = time.time_ns()
for i in range(RUNS):
dirname = Path(directory)
fu = [f for f in dirname.iterdir() if f.is_dir()]
print(f"pathlib.iterdir\ttook {(time.time_ns() - a) / 1000 / 1000 / RUNS:.0f} ms. Found dirs: {len(fu)}")
def run_os_listdir():
a = time.time_ns()
for i in range(RUNS):
dirname = Path(directory)
fu = [os.path.join(directory, o) for o in os.listdir(directory) if os.path.isdir(os.path.join(directory, o))]
print(f"os.listdir\t\ttook {(time.time_ns() - a) / 1000 / 1000 / RUNS:.0f} ms. Found dirs: {len(fu)}")
def run_os_scandir():
a = time.time_ns()
for i in range(RUNS):
fu = [f.path for f in os.scandir(directory) if f.is_dir()]
print(f"os.scandir\t\ttook {(time.time_ns() - a) / 1000 / 1000 / RUNS:.0f} ms.\tFound dirs: {len(fu)}")
if __name__ == '__main__':
run_os_scandir()
run_os_walk()
run_glob()
run_pathlib_iterdir()
run_os_listdir()
यदि आपको एक पुनरावर्ती समाधान की आवश्यकता है जो उपनिर्देशिकाओं में सभी उपनिर्देशिकाओं को ढूंढ लेगा, तो पहले प्रस्तावित के अनुसार चलना का उपयोग करें।
यदि आपको केवल वर्तमान निर्देशिका की बाल निर्देशिकाओं की आवश्यकता है, तो संयोजन os.listdir
करेंos.path.isdir
मैं फ़िल्टर ( https://docs.python.org/2/library/functions.html#filter ) का उपयोग करना पसंद करता हूं , लेकिन यह सिर्फ स्वाद की बात है।
d='.'
filter(lambda x: os.path.isdir(os.path.join(d, x)), os.listdir(d))
अजगर-ओएस-वॉक का उपयोग करके इसे लागू किया गया। ( http://www.pythonforbeginners.com/code-snippets-source-code/python-os-walk/ )
import os
print("root prints out directories only from what you specified")
print("dirs prints out sub-directories from root")
print("files prints out all files from root and directories")
print("*" * 20)
for root, dirs, files in os.walk("/var/log"):
print(root)
print(dirs)
print(files)
आप os.listdir (पथ) का उपयोग करके Python 2.7 में उपनिर्देशिका (और फाइलें) की सूची प्राप्त कर सकते हैं
import os
os.listdir(path) # list of subdirectories and files
os.listdir
फ़ाइलों सहित निर्देशिका की सूची सामग्री।
print("\nWe are listing out only the directories in current directory -")
directories_in_curdir = filter(os.path.isdir, os.listdir(os.curdir))
print(directories_in_curdir)
files = filter(os.path.isfile, os.listdir(os.curdir))
print("\nThe following are the list of all files in the current directory -")
print(files)
पायथन 3.4 ने मानक पुस्तकालय में मॉड्यूल पेश कियाpathlib
, जो फाइलसिस्टम रास्तों को संभालने के लिए एक वस्तु उन्मुख दृष्टिकोण प्रदान करता है:
from pathlib import Path
p = Path('./')
# List comprehension
[f for f in p.iterdir() if f.is_dir()]
# The trailing slash to glob indicated directories
# This will also include the current directory '.'
list(p.glob('**/'))
पाथिब पर भी पाथिब 2 मॉड्यूल के माध्यम से पायथन 2.7 पायथन पर उपलब्ध है ।
for f in filter(Path.is_dir, p.iterdir()):
चूंकि मैं पायथन 3.4 और विंडोज यूएनसी रास्तों का उपयोग करके इस समस्या से लड़ रहा हूं, इसलिए यहां इस वातावरण के लिए एक प्रकार है:
from pathlib import WindowsPath
def SubDirPath (d):
return [f for f in d.iterdir() if f.is_dir()]
subdirs = SubDirPath(WindowsPath(r'\\file01.acme.local\home$'))
print(subdirs)
Pathlib Python 3.4 में नया है और विभिन्न OS के तहत पथों के साथ काम करना बहुत आसान है: https://docs.python.org/3.4/library/pathlib.html
हालांकि इस सवाल का जवाब बहुत समय पहले दिया गया है। मैं pathlib
मॉड्यूल का उपयोग करने की सिफारिश करना चाहता हूं क्योंकि यह विंडोज और यूनिक्स ओएस पर काम करने का एक मजबूत तरीका है।
तो उपनिर्देशिका सहित एक विशिष्ट निर्देशिका में सभी पथ प्राप्त करने के लिए:
from pathlib import Path
paths = list(Path('myhomefolder', 'folder').glob('**/*.txt'))
# all sorts of operations
file = paths[0]
file.name
file.stem
file.parent
file.suffix
आदि।
टिप्स के लिए शुक्रिया दोस्तों। मैं सॉफ्टलिंक्स (अनंत पुनरावर्तन) के साथ एक मुद्दे में भाग गया, जिसे डायर के रूप में लौटाया जा रहा है। Softlinks? हम कोई बदबूदार नरम लिंक नहीं चाहते हैं! इसलिए...
यह सिर्फ डायरियों को प्रस्तुत करता है, सॉफ्टलिंक्स को नहीं:
>>> import os
>>> inf = os.walk('.')
>>> [x[0] for x in inf]
['.', './iamadir']
[x[0] for x in inf]
अजगर में क्या कहा जाता है तो मैं इसे देख सकता हूं?
कॉपी पेस्ट दोस्ताना में ipython
:
import os
d='.'
folders = list(filter(lambda x: os.path.isdir(os.path.join(d, x)), os.listdir(d)))
इससे आउटपुट print(folders)
:
['folderA', 'folderB']
x
सूची से आइटम है os.listdir(d)
क्योंकि listdir
वह फ़ाइलों और फ़ोल्डरों को वापस करेगा जो वह सूची से किसी भी फाइल को फ़िल्टर करने के लिए filter
कमांड का उपयोग कर रहा है os.path.isdir
।
यह मेरा इसे करने का तरीका है।
import os
for x in os.listdir(os.getcwd()):
if os.path.isdir(x):
print(x)
यहाँ @Blair कॉनराड के उदाहरण पर आधारित कुछ सरल कार्य हैं -
import os
def get_subdirs(dir):
"Get a list of immediate subdirectories"
return next(os.walk(dir))[1]
def get_subfiles(dir):
"Get a list of immediate subfiles"
return next(os.walk(dir))[2]
एली बेंडरस्की के समाधान पर निर्माण, निम्नलिखित उदाहरण का उपयोग करें:
import os
test_directory = <your_directory>
for child in os.listdir(test_directory):
test_path = os.path.join(test_directory, child)
if os.path.isdir(test_path):
print test_path
# Do stuff to the directory "test_path"
<your_directory>
उस निर्देशिका के लिए पथ है जहाँ आप ट्रैवर्स करना चाहते हैं।
यह उत्तर पहले से मौजूद नहीं था।
directories = [ x for x in os.listdir('.') if os.path.isdir(x) ]
मैंने हाल ही में एक समान प्रश्न किया है, और मुझे पता चला है कि अजगर 3.6 के लिए सबसे अच्छा उत्तर (जैसा कि उपयोगकर्ता हवलॉक जोड़ा गया है) का उपयोग करना है os.scandir
। चूंकि ऐसा लगता है कि इसका उपयोग करने का कोई हल नहीं है, मैं अपना खुद का जोड़ दूंगा। सबसे पहले, एक गैर-पुनरावर्ती समाधान जो रूट निर्देशिका के तहत सीधे केवल उपनिर्देशिका को सूचीबद्ध करता है।
def get_dirlist(rootdir):
dirlist = []
with os.scandir(rootdir) as rit:
for entry in rit:
if not entry.name.startswith('.') and entry.is_dir():
dirlist.append(entry.path)
dirlist.sort() # Optional, in case you want sorted directory names
return dirlist
पुनरावर्ती संस्करण इस तरह दिखेगा:
def get_dirlist(rootdir):
dirlist = []
with os.scandir(rootdir) as rit:
for entry in rit:
if not entry.name.startswith('.') and entry.is_dir():
dirlist.append(entry.path)
dirlist += get_dirlist(entry.path)
dirlist.sort() # Optional, in case you want sorted directory names
return dirlist
ध्यान रखें कि entry.path
उपनिर्देशिका के लिए निरपेक्ष पथ को जन्म देता है। मामले में आपको केवल फ़ोल्डर नाम की आवश्यकता है, आप entry.name
इसके बजाय उपयोग कर सकते हैं । ऑब्जेक्ट के बारे में अतिरिक्त विवरण के लिए os.DirEntry का संदर्भ लें entry
।
कुछ इस तरह os.path.isdir
से एक फिल्टर फ़ंक्शन का उपयोग os.listdir()
करेंfilter(os.path.isdir,[os.path.join(os.path.abspath('PATH'),p) for p in os.listdir('PATH/')])
यह फ़ाइल ट्री के ठीक नीचे सभी उपनिर्देशिकाओं को सूचीबद्ध करेगा।
import pathlib
def list_dir(dir):
path = pathlib.Path(dir)
dir = []
try:
for item in path.iterdir():
if item.is_dir():
dir.append(item)
dir = dir + list_dir(item)
return dir
except FileNotFoundError:
print('Invalid directory')
pathlib
संस्करण 3.4 में नया है
दिए गए फ़ाइल पथ के भीतर सभी उपनिर्देशिकाओं की सूची वापस करने के लिए फ़ंक्शन। पूरे फ़ाइल ट्री के माध्यम से खोज करेंगे।
import os
def get_sub_directory_paths(start_directory, sub_directories):
"""
This method iterates through all subdirectory paths of a given
directory to collect all directory paths.
:param start_directory: The starting directory path.
:param sub_directories: A List that all subdirectory paths will be
stored to.
:return: A List of all sub-directory paths.
"""
for item in os.listdir(start_directory):
full_path = os.path.join(start_directory, item)
if os.path.isdir(full_path):
sub_directories.append(full_path)
# Recursive call to search through all subdirectories.
get_sub_directory_paths(full_path, sub_directories)
return sub_directories
हम os.walk () का उपयोग करके सभी फ़ोल्डरों की सूची प्राप्त कर सकते हैं
import os
path = os.getcwd()
pathObject = os.walk(path)
यह pathObject एक ऑब्जेक्ट है और हम इसके द्वारा एक अरै प्राप्त कर सकते हैं
arr = [x for x in pathObject]
arr is of type [('current directory', [array of folder in current directory], [files in current directory]),('subdirectory', [array of folder in subdirectory], [files in subdirectory]) ....]
हम के माध्यम से पुनरावृत्ति द्वारा सभी उप-निर्देशिका की सूची प्राप्त कर सकते हैं आगमन और मध्यम सरणी मुद्रण
for i in arr:
for j in i[1]:
print(j)
यह सभी उपनिर्देशिका को प्रिंट करेगा।
सभी फाइलें प्राप्त करने के लिए:
for i in arr:
for j in i[2]:
print(i[0] + "/" + j)
यह फ़ंक्शन, किसी दिए गए माता-पिता के साथ directory
अपने सभी directories
पुनरावर्ती और जो इसके अंदर पाया जाता है, उस पर prints
निर्भर करता filenames
है। बहुत उपयोगी है।
import os
def printDirectoryFiles(directory):
for filename in os.listdir(directory):
full_path=os.path.join(directory, filename)
if not os.path.isdir(full_path):
print( full_path + "\n")
def checkFolders(directory):
dir_list = next(os.walk(directory))[1]
#print(dir_list)
for dir in dir_list:
print(dir)
checkFolders(directory +"/"+ dir)
printDirectoryFiles(directory)
main_dir="C:/Users/S0082448/Desktop/carpeta1"
checkFolders(main_dir)
input("Press enter to exit ;")