2012-04-30 19 views
223

मुझे किसी दिए गए निर्देशिका के अंदर सभी .asm फ़ाइलों के माध्यम से पुन: प्रयास करने की आवश्यकता है और उन पर कुछ कार्य करें।मैं किसी दिए गए निर्देशिका में फ़ाइलों पर कैसे पुन: प्रयास कर सकता हूं?

यह एक कुशल तरीके से कैसे किया जा सकता है?

उत्तर

324

मूल जवाब:

for filename in os.listdir(directory): 
    if filename.endswith(".asm") or filename.endswith(".py"): 
     # print(os.path.join(directory, filename)) 
     continue 
    else: 
     continue 

अजगर 3.6 से ऊपर जवाब का संस्करण, os का उपयोग कर - यह सोचते हैं आप एक चर में एक str वस्तु directory_in_str कहा जाता है के रूप में निर्देशिका पथ है:

directory = os.fsencode(directory_in_str) 

for file in os.listdir(directory): 
    filename = os.fsdecode(file) 
    if filename.endswith(".asm") or filename.endswith(".py"): 
     # print(os.path.join(directory, filename)) 
     continue 
    else: 
     continue 

या pathlib का उपयोग करके,

from pathlib import Path 

pathlist = Path(directory_in_str).glob('**/*.asm') 
for path in pathlist: 
    # because path is object not string 
    path_in_str = str(path) 
    # print(path_in_str) 
+1

यह निर्देशिका में तुरंत निर्देशिकाओं या फ़ाइलों को सूचीबद्ध करता है। नीचे पेड्रोमैटो द्वारा उत्तर एक रिकर्सिव लिस्टिंग करना प्रतीत होता है। –

+5

अच्छा जवाब! मैं जोड़ सकता हूं कि आपको पाइथन "ओएस" मॉड्यूल को आयात करने की आवश्यकता है: - आयात os – Gabrer

+3

कृपया ध्यान दें कि पायथन 3.6 निर्देशिका में बाइट्स में होने की उम्मीद है और फिर listdir बाइट्स डेटा प्रकार में फ़ाइल नामों की एक सूची भी थूक देगा इसलिए आप सीधे इसके साथ समाप्त नहीं कर सकते हैं। इस कोड को ब्लॉक करने के लिए 'निर्देशिका = os.fsencode (directory_in_str) बदल जाना चाहिए os.listdir में फ़ाइल (निर्देशिका) के लिए: ("। एएसएम ") फ़ाइल नाम = os.fsdecode (फाइल) अगर filename.endswith या filename.endswith ("। py"): # प्रिंट (os.path.join (निर्देशिका, फ़ाइल नाम)) जारी रखें: जारी रखें –

73

आप glob मॉड्यूल

import glob 

for filename in glob.iglob('/foobar/*.asm'): 
    print('/foobar/%s' % filename) 
56

का उपयोग कर यह सब वंशज फ़ाइलों पर पुनरावृति जाएगा कोशिश कर सकते हैं न सिर्फ निर्देशिका के तत्काल बच्चों:

import os 

for subdir, dirs, files in os.walk(rootdir): 
    for file in files: 
     #print os.path.join(subdir, file) 
     filepath = subdir + os.sep + file 

     if filepath.endswith(".asm"): 
      print (filepath) 
+1

os.walk फ़ंक्शन का संदर्भ निम्न पर मिलता है: https://docs.python.org/2/library/os.path.html#os.path.walk – ScottMcC

4

अजगर 3.4 और बाद में मानक पुस्तकालय में pathlib प्रदान करते हैं। आप कर सकता है:

from pathlib import Path 

asm_pths = [pth for pth in Path.cwd().iterdir() 
      if pth.suffix == '.asm'] 

या यदि आप सूची comprehensions पसंद नहीं है:

asm_paths = [] 
for pth in Path.cwd().iterdir(): 
    if pth.suffix == '.asm': 
     asm_pths.append(pth) 

Path वस्तुओं आसानी से तार करने के लिए परिवर्तित किया जा सकता है।

0

मैं अभी तक इस कार्यान्वयन से काफी खुश नहीं हूं, मैं एक कस्टम कन्स्ट्रक्टर चाहता था जो DirectoryIndex._make(next(os.walk(input_path))) करता है ताकि आप जिस पथ को फ़ाइल फ़ाइल चाहते हैं उसे पास कर सकें। संपादन का स्वागत है!

import collections 
import os 

DirectoryIndex = collections.namedtuple('DirectoryIndex', ['root', 'dirs', 'files']) 

for file_name in DirectoryIndex(*next(os.walk('.'))).files: 
    file_path = os.path.join(path, file_name) 
संबंधित मुद्दे

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