2013-04-08 51 views
8

Tôi phải mở & ghi vào khoảng 10 tệp khác nhau trong cùng một vòng lặp. ví dụ:Lấy các chi tiết ngoại lệ trong Python

for i in range(0,10): 
    try: 
     a=5 
     file1 = open("file1.txt",'w+') 
     file2 = open("file2.txt",'w+') 
     #... etc 

     print(str(a),file=file1) 
     print(str(a)+"hi",file=file2) 
     # ... etc 
    except: 
     #error handling 

Bây giờ những gì tôi muốn làm là có thể nhận được thông tin ngoại lệ cụ thể như tập tin những gì đã được mở/ghi vào trong ngoại lệ chung. Từ sự hiểu biết hiện tại của tôi, tôi sẽ phải làm một việc như thế này để đạt được những gì tôi muốn:

for i in range(0,5): 
    a=5 
    try: 
     file1 = open("file1.txt",'w+') 
     print(str(a),file=file1) 
    except: 
     #error handling for file1 
    try: 
     file2 = open("file2.txt",'w+') 
     print(str(a)+"hi",file=file2) 
    except: 
     #error handling for file2 

... Mà sẽ trở nên vô cùng khó khăn và không hấp dẫn khi tôi phải làm điều này cho khoảng 10 tệp khác nhau . Có cách nào để có được (ví dụ) các thông tin tên tập tin ra khỏi một ngoại lệ chung như trong ví dụ đầu tiên của tôi? Về cơ bản, trường hợp ngoại lệ có thể báo cáo những thứ như "lỗi khi ghi vào tệp 1" mà không cần thử/ngoại trừ cụ thể cho các hoạt động của tệp1.

chỉnh sửa: Đây là sự đơn giản hóa quá lớn dữ liệu được ghi vào tệp. str (a) và str (a) + "hi" không đại diện cho dữ liệu thực sự được viết; file1 có thể cần một số nguyên cứng, trong đó file2 có thể cần một chuỗi được định dạng với nhiều biến. để khái quát hóa quá trình mở/viết thành một vòng lặp sẽ không hoạt động rất tốt.

Trả lời

1

Bạn đề cập đến việc sử dụng vòng lặp, nhưng bạn không thực sự sử dụng vòng lặp. Sử dụng vòng lặp. Bằng cách đó bạn có thể viết từng tệp, từng tệp một, bên trong một khối try. Bạn dường như không làm bất cứ điều gì với các tập tin ngoại trừ viết một giá trị cho mỗi tập tin, vì vậy bạn không cần phải giữ tất cả chúng mở.

for filename in ['file1.txt', 'file2.txt', ...]: 
    try: 
     with open(filename, 'w+') as f: 
      f.write(str(a)+"whatever") 
    except IOError: 
     print("Error occurred with", filename) 

Edit: Nếu bạn có những thứ cực kỳ khác nhau để viết thư cho các tập tin khác nhau, tạo ra một từ điển hay một cấu trúc dữ liệu khác trước thời hạn lưu trữ các ánh xạ giữa các tập tin và dữ liệu, sau đó sử dụng trong vòng lặp.

data = {'file1.txt': str(a), 'file2.txt': 'something else', 'file3.txt': str(a)+str(b)} 

for filename, output in data.items(): 
    try: 
     with open(filename, 'w+') as f: 
      f.write(output) 
    except IOError: 
     print("Error occurred with", filename) 
+0

tôi có nghĩa là cho mã bao gồm để được xem xét như thể nó đã ở trong một vòng lặp. bị bệnh đó. Nhưng bất kể điều này không thực sự giải quyết được vấn đề của tôi. Những thứ được ghi vào các tệp này không nhất thiết phải giống nhau về bất kỳ cách nào, hình dạng hoặc hình thức nào. File1 có thể cần một "1" được mã hoá cứng để in, tệp 2 có thể cần một biến được in cho nó và tệp3 có thể cần nhiều biến. những gì sẽ xảy ra cuối cùng là một tuyên bố lớn trong "với"; ví dụ. "nếu filename = file1, viết cái này, nếu filename = file2, hãy viết cái đó; nếu filename = file3, viết cái khác này". Mã sẽ giống như clunky – user891876

+0

@ user891876: Xem câu trả lời đã chỉnh sửa của tôi. Sắp xếp lại mối quan hệ giữa các tệp và dữ liệu, sau đó ghi từng phần dữ liệu vào tệp được liên kết của nó trong vòng lặp. – BrenBarn

+0

nếu tôi không muốn in thành tệp 3 nếu chiều dài (str (a) + str (b))> 5? mỗi tệp cần chắc chắn logic riêng của nó. – user891876

15

Bạn có thể sử dụng sys.exc_info để có được thông tin về các ngoại lệ hiện đang được xử lý, bao gồm các đối tượng ngoại lệ riêng của mình. Một IOError ngoại lệ chứa tất cả các thông tin mà bạn cần, bao gồm tên tập tin, các errno, và một chuỗi mô tả lỗi:

import sys 

try: 
    f1 = open('example1') 
    f2 = open('example2') 
except IOError: 
    type, value, traceback = sys.exc_info() 
    print('Error opening %s: %s' % (value.filename, value.strerror)) 

Thực hiện trong khối try sẽ rõ ràng là vẫn còn ngăn chặn sau khi ngoại lệ đầu tiên.

1

Khi sử dụng exc_type, value, exc_traceback = sys.exc_info(), lưu ý rằng tên tập tin đã tạo ra ngoại lệ có thể đạt được thông qua như sau:

exc_traceback.tb_frame.f_locals.get('filename') 
Các vấn đề liên quan