2012-06-25 33 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 

Ở đây tôi đang cố gắng in kích thước của tất cả các tệp trong thư mục (và phụ). Nhưng tôi biết im nằm ngoài phạm vi khi ở dòng im.size. Nhưng làm cách nào khác để tôi làm điều đó mà không cần sử dụng các khối else hoặc finally.Phạm vi biến đổi và Thử bắt trong python

Các lỗi sau đây được hiển thị:

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

'phạm vi im' là * không * giới hạn ở những' try' khối; đây không phải là C++. – cdhowie

+0

@cdhowie: trong trường hợp đó, tại sao lỗi trên? – shahalpk

+12

Lỗi được hiển thị vì biến 'im' không được xác định thành công nếu' Image.open' không thành công do đó nó không tồn tại khi bạn thử và truy cập thuộc tính '.size'. –

Trả lời

20

Điều gì sai với mệnh đề "khác"?

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 

Bây giờ kể từ khi bạn đang ở trong một vòng lặp, bạn cũng có thể sử dụng một "tiếp tục" tuyên bố:

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) 

Ngoài ra, không ; bằng Python.

+0

tôi muốn viết thêm, nhưng tôi không muốn nó bên trong khối thử. bất kỳ ý tưởng? – shahalpk

+2

@ShahalTharique Vấn đề là khối 'except' của bạn không nhánh ở đâu đó, vì vậy nó thực thi và sau đó lệnh' print' thực hiện. Kể từ khi ngoại lệ được ném, 'im' chưa bao giờ được gán cho. Bạn cần xử lý lỗi bằng cách chuyển đến mục tiếp theo ('tiếp tục') hoặc bằng cách rời khỏi vòng lặp' for' ('ngắt'). – cdhowie

+0

@Burhan tat có ý nghĩa. cảm ơn. – shahalpk

3

Nếu bạn không thể mở tệp dưới dạng hình ảnh và chỉ muốn làm việc trên hình ảnh hợp lệ, hãy bao gồm tuyên bố continue trong khối ngoại trừ sẽ đưa bạn đến lần lặp tiếp theo của vòng for.

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

không phải là câu hỏi của tôi. nhưng tôi phải nói với bạn, nó hoạt động ngay cả khi không có câu lệnh 'continue'. – shahalpk

+1

@ShahalTharique Câu hỏi của bạn là thiếu sót, bởi vì bạn cho rằng phạm vi của 'im' được giới hạn trong khối' try', trong khi thực tế nó không phải là. – cdhowie

+1

'continue' có sẵn để nếu bạn không mở thành công hình ảnh, nó sẽ tiếp tục đến tập tin tiếp theo trong vòng lặp của bạn vì bạn sẽ không có một đối tượng gọi là' im' được tạo ra và do đó sẽ không có quyền truy cập vào các thuộc tính của nó và phương pháp. –