2013-04-11 7 views
5

यूनिक्स फ़ाइल नाम वाइल्डकार्डपायथन से कैसे काम करते हैं?पायथन में यूनिक्स फ़ाइल नाम वाइल्डकार्ड?

एक दिया निर्देशिका केवल प्रत्येक में उपनिर्देशिका, जिनमें से (दूसरों के बीच) है एक फ़ाइल जिसका नाम एक ज्ञात तार के साथ समाप्त होता है, कहते हैं कि _ext शामिल हैं। फ़ाइल नाम का पहला भाग हमेशा भिन्न होता है, इसलिए मुझे इस पैटर्न का उपयोग करके फ़ाइल में जाना होगा।

मैं इस करना चाहता था:

directory = "." 
listofSubDirs = [x[0] for x in os.walk(directory)] 
listofSubDirs = listofSubDirs[1:] #removing "." 

for subDirectory in listofSubDirs: 
    fileNameToPickle = subDirectory + "/*_ext" #only one such file exists 
    fileToPickle = pickle.load(open(fileNameToPickle, "rb")) 
    ... do stuff ... 

लेकिन कोई पैटर्न मिलान होता है। यह पायथन के तहत कैसे काम करता है?

+3

'glob.glob ('* _ ext')' वाइल्डकार्ड का समर्थन करता है। – eumiro

+0

आपको वास्तव में ग्लोब का उपयोग करना चाहिए: http://docs.python.org/2/library/glob.html – Aif

उत्तर

9

शैल वाइल्डकार्ड पैटर्न पायथन में काम नहीं करते हैं। इसके बजाय वाइल्डकार्ड की व्याख्या करने के लिए fnmatch या glob मॉड्यूल का उपयोग करें। fnmatch वाइल्डकार्ड का अर्थ देता है और आपको उनके खिलाफ तारों से मिलान करने देता है, globfnmatch आंतरिक रूप से os.listdir() के साथ मिलकर फ़ाइल नामों की एक सूची देने के लिए उपयोग करता है।

इस मामले में, मैं प्रयोग करेंगे fnmatch.filter():

import os 
import fnmatch 

for dirpath, dirnames, files in os.walk(directory): 
    for filename in fnmatch.filter(files, '*_ext'): 
     fileNameToPickle = os.path.join(dirpath, filename) 
     fileToPickle = pickle.load(open(fileNameToPickle, "rb")) 

अपने संरचना केवल एक उपनिर्देशिका के स्तर में शामिल है, तो आप भी एक glob() पैटर्न है कि कि व्यक्त करता है इस्तेमाल कर सकते हैं; पथ अभिव्यक्ति की में */ सभी सबडायरेक्टरियों मिलान करने के लिए विस्तार किया गया है:

import glob 
import os 

for filename in glob.glob(os.path.join(directory, '*/*_ext')): 
    # loops over matching filenames in all subdirectories of `directory`. 
संबंधित मुद्दे