2012-06-25 19 views
21
import Image 
import os 
for dirname, dirs, files in os.walk("."): 
    for filename in files: 
     try: 
      im = Image.open(os.path.join(dirname,filename)) 
     except IOError: 
      print "error opening file :: " + os.path.join(dirname,filename) 
     print im.size 

यहां मैं निर्देशिका (और उप) में सभी फ़ाइलों का आकार प्रिंट करने की कोशिश कर रहा हूं। लेकिन मुझे पता है कि im लाइन im.size में दायरे से बाहर है। लेकिन else या finally ब्लॉक का उपयोग किए बिना मैं इसे और कैसे कर सकता हूं।परिवर्तनीय दायरा और पाइथन में प्रयास करें

निम्न त्रुटि दिखाया गया है:

Traceback (most recent call last): 
    File "batch.py", line 13, in <module> 
    print im.size 
NameError: name 'im' is not defined 
+27

'im' की गुंजाइश * नहीं *' try' ब्लॉक करने के लिए सीमित; यह सी ++ नहीं है। – cdhowie

+0

@cdhowie: उस मामले में, उपर्युक्त त्रुटि क्यों? – shahalpk

+12

त्रुटि दिखायी गई है क्योंकि 'Image.open' विफल होने पर परिवर्तनीय' im' को सफलतापूर्वक परिभाषित नहीं किया गया है, इसलिए जब आप '.size' विशेषता को आज़माते हैं और एक्सेस करते हैं तो यह मौजूद नहीं होता है। –

उत्तर

20

"अन्य" खंड में क्या गलत है?

for filename in files: 
    try: 
     im = Image.open(os.path.join(dirname,filename)) 
    except IOError, e: 
     print "error opening file :: %s : %s" % (os.path.join(dirname,filename), e) 
    else: 
     print im.size 

अब जब से तुम एक पाश में हैं, तो आप भी एक बयान "जारी रखें" का उपयोग कर सकते हैं:

for filename in files: 
    try: 
     im = Image.open(os.path.join(dirname,filename)) 
    except IOError, e: 
     print "error opening file :: %s : %s" % (os.path.join(dirname,filename), e) 
     continue 

    print im.size 
2
import Image 
import os 
for dirname,dirs,files in os.walk("."): 
    for filename in files: 
     try: 
      im = Image.open(os.path.join(dirname,filename)) 
      print im.size 
     except IOError: 
      print "error opening file :: " + os.path.join(dirname,filename) 

इसके अलावा, पायथन में कोई ;

+0

मैं आगे कोड करना चाहता हूं, लेकिन मैं इसे कोशिश ब्लॉक के अंदर नहीं चाहता हूं। कोई विचार? – shahalpk

+2

@ शाहल थारिक समस्या यह है कि आपका 'छोड़कर' ब्लॉक कहीं भी शाखा नहीं है, इसलिए यह निष्पादित होता है और फिर 'प्रिंट' कथन करता है। चूंकि अपवाद फेंक दिया गया था, इसलिए 'आईएम' को कभी सौंपा नहीं गया था। आपको अगली आइटम ('जारी रखें ') पर जाकर या' लूप '(' ब्रेक') छोड़कर त्रुटि को संभालने की आवश्यकता है। – cdhowie

+0

@ बुरहान टैट समझ में आता है। धन्यवाद। – shahalpk

3

यदि आप फ़ाइल को छवि के रूप में नहीं खोल सकते हैं, और केवल वैध छवियों पर काम करना चाहते हैं, तो अपने for लूप के अगले पुनरावृत्ति पर आपको continue कथन शामिल करें।

try: 
    im = Image.open(os.path.join(dirname, filename)) 
except IOError: 
    print 'error opening file :: ' + os.path.join(dirname, filename) 
    continue 
+0

मेरे प्रश्न नहीं है। लेकिन मुझे आपको बताना होगा, यह 'जारी रखें' कथन के बिना भी काम करता है। – shahalpk

+1

@ शाहल थारिक आपका प्रश्न त्रुटिपूर्ण है, क्योंकि आप मानते हैं कि 'आईएम' का दायरा 'try' ब्लॉक तक सीमित है, वास्तव में यह नहीं है। – cdhowie

+1

'जारी रखें' है ताकि अगर आपने छवि को सफलतापूर्वक खोला नहीं है तो यह आपके लूप में अगली फाइल पर जारी रहेगा क्योंकि आपके पास 'im' नामक ऑब्जेक्ट नहीं होगा और इसलिए इसके गुणों तक पहुंच नहीं होगी और तरीके। –

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