2009-06-05 13 views
30

सहित निर्देशिका में फ़ाइलों को कैसे प्राप्त करें, मैं सभी उपनिर्देशिकाओं सहित निर्देशिका में सभी लॉग फ़ाइलों (.log) की एक सूची प्राप्त करने का प्रयास कर रहा हूं।सभी उपनिर्देशिका

+1

यह पहले से ही कहा गया है: http://stackoverflow.com/questions/837606/find-the-oldest-file-recursively-in- एक निर्देशिका, साथ ही साथ कुछ अन्य (खोज बॉक्स में 'पायथन चलना' खोजें) –

उत्तर

-1

आप मौजूदा निर्देशिका में सूचीबद्ध करने के लिए चाहते हैं, आप की तरह कुछ का उपयोग कर सकते हैं:

import os 

for e in os.walk(os.getcwd()): 
    print e 

बस वहाँ परिणाम प्राप्त करने के अन्य रास्ते पर

os.getcwd() 

बदल जाते हैं।

+0

यह उत्तर ओपी के प्रश्न को संबोधित नहीं करता है और यह उन लोगों के लिए प्रासंगिक नहीं है जो एक ही उत्तर की तलाश करेंगे। – Andrew

59
import os 
import os.path 

for dirpath, dirnames, filenames in os.walk("."): 
    for filename in [f for f in filenames if f.endswith(".log")]: 
     print os.path.join(dirpath, filename) 
+1

यदि आप "।" से एक अलग निर्देशिका में खोजना चाहते हैं। आप sys.argv [1] के रूप में direcotry पास कर सकते हैं और os.walk (sys.argv [1]) कॉल करें। –

+2

अतिरिक्त सुधार: सूची समझ के बजाय जनरेटर का उपयोग करें: फ़ाइल नाम के लिए (f के लिए f ...) –

+1

यदि आप किसी निश्चित निर्देशिका को बहिष्कृत करना चाहते हैं, उदाहरण के लिए, 'old_logs', तो आप इसे' dirnames' से हटा सकते हैं और यह खोज नहीं की जाएगी: 'अगर "old_logs" dirnames में: dirnames.remove ("old_logs") ' – CGFoX

6

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

import os 
for logfile in os.popen('find . -type f -name *.log').read().split('\n')[0:-1]: 
     print logfile 

या

import subprocess 
(out, err) = subprocess.Popen(["find", ".", "-type", "f", "-name", "*.log"], stdout=subprocess.PIPE).communicate() 
for logfile in out.split('\n')[0:-1]: 
    print logfile 

इन दो find . -type f -name *.log का लाभ लें:

import os 
from glob import glob 

files = [] 
start_dir = os.getcwd() 
pattern = "*.log" 

for dir,_,_ in os.walk(start_dir): 
    files.extend(glob(os.path.join(dir,pattern))) 
+0

अंडरस्कोर फॉर-लूप में क्या करते हैं? '_' –

+1

@ न्यूवेस्ट 'ओ। वॉल्क' प्रत्येक पुनरावृत्ति पर एक 3-टुपल '(दिरपथ, डायरनाम, फ़ाइल नाम)' देता है, और हम केवल 'दिरपथ' (उपरोक्त 'डीआईआर' को सौंपा गया) में रूचि रखते हैं; अंडरस्कोर का उपयोग अन्य 2 मूल्यों के लिए प्लेसहोल्डर्स के रूप में किया जाता है, जिनकी हमें रुचि नहीं है (यानी 'dirnames', और फिर' फ़ाइल नाम ', वेरिएबल '_' को असाइन किए जा रहे हैं, जिसे हम कभी भी उपयोग नहीं करेंगे)। – tavnab

0

मैं एक समाधान है।

पहले एक सरल लेकिन जब -name *.log, जोड़ने लेकिन बस find ../testdata -type f के लिए ठीक काम किया (मेरे ओएस एक्स वातावरण में) सफेद-अंतरिक्ष के लिए इसकी गारंटी नहीं है।

दूसरा प्रोप्रोसेस का उपयोग करने वाला दूसरा अधिक जटिल लगता है, लेकिन यह श्वेत-स्थान सुरक्षित है (फिर से, मेरे ओएस एक्स पर्यावरण में)।

इससे कार्तिक गुच्छा, जवाब में से प्रेरित है https://stackoverflow.com/a/3503909/2834102

संबंधित मुद्दे