पायथन सूची निर्देशिका, उपनिर्देशिका, और फाइलें


130

मैं एक निर्देशिका में सभी निर्देशिका, उपनिर्देशिका और फ़ाइलों को सूचीबद्ध करने के लिए एक स्क्रिप्ट बनाने की कोशिश कर रहा हूं।
मैंने यह कोशिश की:

import sys,os

root = "/home/patate/directory/"
path = os.path.join(root, "targetdirectory")

for r,d,f in os.walk(path):
    for file in f:
        print os.path.join(root,file)

दुर्भाग्य से यह ठीक से काम नहीं करता है।
मुझे सारी फाइलें मिलती हैं, लेकिन उनका पूरा रास्ता नहीं है।

उदाहरण के लिए यदि dir संरचना होगी:

/home/patate/directory/targetdirectory/123/456/789/file.txt

यह प्रिंट होगा:

/home/patate/directory/targetdirectory/file.txt

मुझे जो चाहिए वह पहला परिणाम है। किसी भी तरह की सहायता का स्वागत किया जाएगा! धन्यवाद।

जवाबों:


225

निर्देशिका और फ़ाइल का नामos.path.join संक्षिप्त करने के लिए उपयोग करें :

for path, subdirs, files in os.walk(root):
    for name in files:
        print os.path.join(path, name)

नोट का उपयोग करें pathऔर न rootकि सहमति में, क्योंकि उपयोग rootकरना गलत होगा।


पायथन 3.4 में, पाथलिब मॉड्यूल आसान पथ जोड़तोड़ के लिए जोड़ा गया था। तो इसके बराबर os.path.joinहोगा:

pathlib.PurePath(path, name)

इसका फायदा pathlibयह है कि आप रास्तों पर कई तरह के उपयोगी तरीकों का इस्तेमाल कर सकते हैं। यदि आप ठोस Pathसंस्करण का उपयोग करते हैं, तो आप उनके माध्यम से वास्तविक ओएस कॉल भी कर सकते हैं, जैसे कि एक निर्देशिका में चंडिंग करना, पथ को हटाना, फ़ाइल को खोलना और बहुत कुछ।


यह उन सभी सवालों के लिए एक और केवल उपयोगी उत्तर है, जो "अजगर में पुनरावृत्ति की सभी फाइलें कैसे प्राप्त करें" से संबंधित पूछे गए हैं।
harrisonfooord

बोध सूची: all_files = [os.path.join (पथ, नाम) पथ के लिए फ़ाइलों में नाम के लिए, सबडिरेस, os.walk में फ़ाइलें (फ़ोल्डर)]
Nir

45

बस मामले में ... निर्देशिका और उपनिर्देशिकाओं में सभी फाइलों को कुछ पैटर्न से मिलान करना (* उदाहरण के लिए .py)।

import os
from fnmatch import fnmatch

root = '/some/directory'
pattern = "*.py"

for path, subdirs, files in os.walk(root):
    for name in files:
        if fnmatch(name, pattern):
            print os.path.join(path, name)

10

यहाँ एक लाइनर है:

import os

[val for sublist in [[os.path.join(i[0], j) for j in i[2]] for i in os.walk('./')] for val in sublist]
# Meta comment to ease selecting text

बाहरी सबसे अधिक val for sublist in ...लूप सूची को एक आयामी बनाता है। jपाश हर फ़ाइल basename की एक सूची एकत्र करता है और वर्तमान पथ को यह मिलती है। अंत में, iलूप सभी निर्देशिकाओं और उप निर्देशिकाओं पर प्रसारित होता है।

यह उदाहरण कॉल ./में हार्ड-कोडेड पथ का उपयोग करता है os.walk(...), आप अपनी पसंद के किसी भी पथ स्ट्रिंग को पूरक कर सकते हैं।

नोट: os.path.expanduserऔर / या os.path.expandvarsपथ के तार के लिए इस्तेमाल किया जा सकता है जैसे~/

इस उदाहरण का विस्तार:

इसका फ़ाइल बेसेंन परीक्षण और डायरेक्टरी नाम परीक्षण में जोड़ना आसान है।

उदाहरण के लिए, *.jpgफ़ाइलों के लिए परीक्षण :

... for j in i[2] if j.endswith('.jpg')] ...

इसके अतिरिक्त, .gitनिर्देशिका को छोड़कर :

... for i in os.walk('./') if '.git' not in i[0].split('/')]

यह काम करता है, लेकिन .it directoy को बाहर निकालने के लिए आपको यह जांचने की आवश्यकता है कि '.git' रास्ते में नहीं है।
रोमन रग्ज

हां। होना चाहिए अगर '.it' में नहीं [0]। Split ('/')]
रोमन Rdgz

मैं os.walkएक मैनुअल डॉरलिंग लूप की सिफारिश करूंगा, जनरेटर बहुत बढ़िया हैं, उनका उपयोग करें।
थोरसुमोनर

9

यहाँ उत्तर लिखने में कोई टिप्पणी नहीं कर सकता। यह मेरे द्वारा देखी गई सबसे स्पष्ट एक-पंक्ति है:

import os
[os.path.join(path, name) for path, subdirs, files in os.walk(root) for name in files]

4

आप मेरे द्वारा बनाए गए इस नमूने पर एक नज़र डाल सकते हैं। यह os.path.walk फ़ंक्शन का उपयोग करता है जो कि डिप्रेसेरेटेड बीवेयर है। सभी फ़ाइलपथों को संग्रहीत करने के लिए एक सूची का उपयोग करता है

root = "Your root directory"
ex = ".txt"
where_to = "Wherever you wanna write your file to"
def fileWalker(ext,dirname,names):
    '''
    checks files in names'''
    pat = "*" + ext[0]
    for f in names:
        if fnmatch.fnmatch(f,pat):
            ext[1].append(os.path.join(dirname,f))


def writeTo(fList):

    with open(where_to,"w") as f:
        for di_r in fList:
            f.write(di_r + "\n")






if __name__ == '__main__':
    li = []
    os.path.walk(root,fileWalker,[ex,li])

    writeTo(li)

4

थोड़ा सरल वन-लाइनर:

import os
from itertools import product, chain

chain.from_iterable([[os.sep.join(w) for w in product([i[0]], i[2])] for i in os.walk(dir)])

2

चूँकि यहाँ हर उदाहरण का उपयोग किया जा रहा है walk(साथ में join), मैं एक अच्छा उदाहरण और तुलना करना चाहूँगा listdir:

import os, time

def listFiles1(root): # listdir
    allFiles = []; walk = [root]
    while walk:
        folder = walk.pop(0)+"/"; items = os.listdir(folder) # items = folders + files
        for i in items: i=folder+i; (walk if os.path.isdir(i) else allFiles).append(i)
    return allFiles

def listFiles2(root): # listdir/join (takes ~1.4x as long) (and uses '\\' instead)
    allFiles = []; walk = [root]
    while walk:
        folder = walk.pop(0); items = os.listdir(folder) # items = folders + files
        for i in items: i=os.path.join(folder,i); (walk if os.path.isdir(i) else allFiles).append(i)
    return allFiles

def listFiles3(root): # walk (takes ~1.5x as long)
    allFiles = []
    for folder, folders, files in os.walk(root):
        for file in files: allFiles+=[folder.replace("\\","/")+"/"+file] # folder+"\\"+file still ~1.5x
    return allFiles

def listFiles4(root): # walk/join (takes ~1.6x as long) (and uses '\\' instead)
    allFiles = []
    for folder, folders, files in os.walk(root):
        for file in files: allFiles+=[os.path.join(folder,file)]
    return allFiles


for i in range(100): files = listFiles1("src") # warm up

start = time.time()
for i in range(100): files = listFiles1("src") # listdir
print("Time taken: %.2fs"%(time.time()-start)) # 0.28s

start = time.time()
for i in range(100): files = listFiles2("src") # listdir and join
print("Time taken: %.2fs"%(time.time()-start)) # 0.38s

start = time.time()
for i in range(100): files = listFiles3("src") # walk
print("Time taken: %.2fs"%(time.time()-start)) # 0.42s

start = time.time()
for i in range(100): files = listFiles4("src") # walk and join
print("Time taken: %.2fs"%(time.time()-start)) # 0.47s

तो जैसा कि आप अपने लिए देख सकते हैं, listdirसंस्करण बहुत अधिक कुशल है। (और joinयह धीमा है)

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