2012-11-08 8 views
24

में फ़ाइल एक्सटेंशन वाइल्डकार्ड का उपयोग करना मेरे पास फाइलों की एक निर्देशिका है जिसे मैं पायथन का उपयोग करके पार्स करने की कोशिश कर रहा हूं। अगर वे सभी एक ही एक्सटेंशन थे, तो मुझे कोई समस्या नहीं होगी, लेकिन किसी भी कारण से वे अपने मूल एक्सटेंशन के बाद अनुक्रमिक संख्यात्मक एक्सटेंशन के साथ बनाए गए हैं। उदाहरण के लिए: foo.log foo.log.1 foo.log.2 bar.log bar.log.1 bar.log.2 etc. उस के शीर्ष पर, foo.log XML प्रारूप में है, जबकि bar.log नहीं है। केवल foo.log.*औरfoo.log फ़ाइलों को पढ़ने और विश्लेषण करने के लिए सबसे अच्छा तरीका क्या है? bar.log फ़ाइलों को पढ़ने की आवश्यकता नहीं है। नीचे मेरी कोड है:os.listdir (पथ)

import os 
from lxml import etree 
path = 'C:/foo/bar//' 
listing = os.listdir(path) 
for files in listing: 
    if files.endswith('.log'): 
     print files 
     data = open(os.path.join(path, files), 'rb').read() 
     tree = etree.fromstring(data) 
     search = tree.findall('.//QueueEntry') 

इस रूप में यह किसी भी .log.* फ़ाइलों को पढ़ने नहीं है और पार्सर फ़ाइलों को पढ़ने के लिए कर रहे हैं पर chokes, लेकिन xml स्वरूप में नहीं हैं काम नहीं करता। धन्यवाद!

उत्तर

41

शायद glob मॉड्यूल आप मदद कर सकते हैं:

import glob 

listing = glob.glob('C:/foo/bar/foo.log*') 
for filename in listing: 
    # do stuff 
+1

यदि ओपी इसे पॉसिक्स शैल की बजाय विंडोज 'cmd' खोल में वाइल्डकार्ड की तरह काम करने की उम्मीद कर रहा है, तो यह बिल्कुल सही नहीं है ... लेकिन यह उसके उपयोग के मामले के लिए पर्याप्त होना चाहिए, और किसी भी उपयोग के मामले में सबसे अधिक संभावना है साथ आने के लिए, तो मुझे लगता है कि यह सही जवाब है। – abarnert

+0

उसने ऐसा किया, धन्यवाद! –

+0

'~' का विस्तार नहीं करने के लिए धन्यवाद ग्लोब - किसी भी तरह से पाइथन यूनिक्स की तुलना में सभी सिस्टम कमांड को खराब बनाता है ... – user3467349

3

यह आपको बैश की तरह regexes देंगे:

import glob 
print(glob.glob("/tmp/o*")) 

वैकल्पिक रूप से, आप पूरी निर्देशिका os.listdir सकता है, और दूर फेंक देते हैं फ़ाइलें जो पुनः मॉड्यूल के माध्यम से regex से मेल नहीं खाते हैं।

+0

ग्लोब वाइल्डकार्ड रेगेक्स नहीं हैं। खैर, तकनीकी रूप से बोलते हुए, यह एक नियमित भाषा है, लेकिन जब लोग "रेगेक्स" कहते हैं, तो लोग ऐसा नहीं सोचते हैं, और बैश दस्तावेज़ स्पष्ट रूप से कहते हैं कि यह regex नहीं है। '/ tmp/o *' का अर्थ "'/tmp/'के बाद 0 या उससे अधिक उदाहरणों के बाद नहीं है"। देखें [ग्लोबिंग] (http://tldp.org/LDP/abs/html/globbingref.html)। – abarnert

+1

मैंने comp.unix.shell पर बहुत पहले सीखा था, कि * ix में ग्लोब पैटर्न समेत कई प्रकार के रेगेक्स हैं। "एडवांस्ड बैश स्क्रिप्टिंग गाइड" बैश प्रलेखन का हिस्सा नहीं है - यह एक पर्ल zealot द्वारा लिखे गए एक स्केड है जो शायद सोचता है कि पर्ल रेगेक्स एकमात्र प्रकार के रेगेक्स हैं जिनका उपयोग किसी को भी करना चाहिए। – dstromberg

+0

यहां [ग्लोब' के लिए आधिकारिक POSIX दस्तावेज़] है (http://pubs.opengroup.org/onlinepubs/7908799/xsh/glob.html)। यह "नियमित अभिव्यक्ति" या कुछ भी समान नहीं कहता है। यहां [नियमित अभिव्यक्तियों 'के लिए आधिकारिक POSIX दस्तावेज़] (http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap09.html) है। यह विशेष रूप से दो भाषाओं को परिभाषित करता है जो नियमित अभिव्यक्ति (बीआरई और ईआरई) के रूप में गिना जाता है। आपको 'bash', 'linux' /' glibc', '* बीएसडी', आदि प्रलेखन में समान शब्द मिलेंगे। एक महान स्पष्टीकरण के लिए – abarnert

10

केवल foo.log.* और foo.log फ़ाइलों को पढ़ने और विश्लेषण करने के लिए सबसे अच्छा तरीका क्या है? Bar.log फ़ाइलों को पढ़ने की आवश्यकता नहीं है।

if files.endswith('.log'): 

तुम बस अजगर एक सा गलत में अपने अंग्रेजी विवरण अनुवाद किया है:

आपका कोड से करता है। पाइथन में आप जो लिखते हैं वह है: "केवल *.log फाइलें पढ़ें और पार्स करें", जिसका अर्थ है bar.log शामिल है, और foo.log.1 नहीं है।

लेकिन अगर आप एक पल के लिए लगता है, आप अपने अंग्रेजी विवरण सीधे अजगर में अनुवाद कर सकते हैं:

if files == 'foo.log' or files.startswith('foo.log.'): 

और अगर आप, इसके बारे में सोचो, जब तक वहाँ कोई फ़ाइलें foo.log. नामित (कि अतिरिक्त डॉट के साथ कर रहे हैं) आप छोड़ना चाहते हैं, तो आप एक में दो मामलों पतन कर सकते हैं:

if files.startswith('foo.log'): 

हालांकि, अगर आप POSIX गोले, foo.log* मैचों बिल्कुल वही बात के बारे में कुछ पता है। (यह विंडोज शैल के लिए सच नहीं है, जहां वाइल्डकार्ड विशेष रूप से एक्सटेंशन का इलाज करते हैं, यही कारण है कि आपको * के बजाय *.* टाइप करना होगा।) और पायथन एक मॉड्यूल के साथ आता है जो विंडोज़ पर भी पॉज़िक्स-शैली वाइल्डकार्ड करता है, जिसे glob कहा जाता है। इसका उपयोग कैसे करें इसके लिए stranac का जवाब देखें।

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

+0

+1 –

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