को छोड़कर एक प्रयास में व्यक्तिगत विवरणों को लपेटने के लिए पायथन साफ तरीका मैं वर्तमान में कॉम के साथ एक्सेल के कुछ पायथन स्वचालन कर रहा हूं। यह पूरी तरह कार्यात्मक है, और जो मैं चाहता हूं वह करता है, लेकिन मुझे कुछ आश्चर्य की बात है। कभी-कभी, मेरे द्वारा उपयोग किए जाने वाले कुछ एक्सेल कमांड किसी स्पष्ट कारण के लिए अपवाद के साथ विफल हो जाएंगे। अन्य बार, वे काम करेंगे।ब्लॉक
मैं जो कर रहा हूं उसके लिए वीबी समकक्ष कोड में, यह समस्या स्पष्ट रूप से सामान्य मानी जाती है, और On Error Resume Next
कथन के साथ plastered है। पाइथन ने निश्चित रूप से बयान नहीं कहा है।
मैं पूरे सेट को try except
लूप में लपेट नहीं सकता, क्योंकि यह आधा रास्ते "विफल" हो सकता है और ठीक से पूरा नहीं हो सकता है। तो, ब्लॉक को छोड़कर एक कोशिश में कई स्वतंत्र बयान लपेटने के लिए एक पाइथोनिक तरीका क्या होगा? विशेष रूप से, कुछ क्लीनर की तुलना में:
try:
statement
except:
pass
try:
statement
except:
pass
प्रासंगिक कोड excel.Selection.Borders
बिट है।
def addGridlines(self, infile, outfile):
"""convert csv to excel, and add gridlines"""
# set constants for excel
xlDiagonalDown = 5
xlDiagonalUp = 6
xlNone = -4142
xlContinuous = 1
xlThin = 2
xlAutomatic = -4105
xlEdgeLeft = 7
xlEdgeTop = 8
xlEdgeBottom = 9
xlEdgeRight = 10
xlInsideVertical = 11
xlInsideHorizontal = 12
# open file
excel = win32com.client.Dispatch('Excel.Application')
workbook = excel.Workbooks.Open(infile)
worksheet = workbook.Worksheets(1)
# select all cells
worksheet.Range("A1").CurrentRegion.Select()
# add gridlines, sometimes some of these fail, so we have to wrap each in a try catch block
excel.Selection.Borders(xlDiagonalDown).LineStyle = xlNone
excel.Selection.Borders(xlDiagonalUp).LineStyle = xlNone
excel.Selection.Borders(xlDiagonalUp).LineStyle = xlNone
excel.Selection.Borders(xlEdgeLeft).LineStyle = xlContinuous
excel.Selection.Borders(xlEdgeLeft).Weight = xlThin
excel.Selection.Borders(xlEdgeLeft).ColorIndex = xlAutomatic
excel.Selection.Borders(xlEdgeTop).LineStyle = xlContinuous
excel.Selection.Borders(xlEdgeTop).Weight = xlThin
excel.Selection.Borders(xlEdgeTop).ColorIndex = xlAutomatic
excel.Selection.Borders(xlEdgeBottom).LineStyle = xlContinuous
excel.Selection.Borders(xlEdgeBottom).Weight = xlThin
excel.Selection.Borders(xlEdgeBottom).ColorIndex = xlAutomatic
excel.Selection.Borders(xlEdgeRight).LineStyle = xlContinuous
excel.Selection.Borders(xlEdgeRight).Weight = xlThin
excel.Selection.Borders(xlEdgeRight).ColorIndex = xlAutomatic
excel.Selection.Borders(xlInsideVertical).LineStyle = xlContinuous
excel.Selection.Borders(xlInsideVertical).Weight = xlThin
excel.Selection.Borders(xlInsideVertical).ColorIndex = xlAutomatic
excel.Selection.Borders(xlInsideHorizontal).LineStyle = xlContinuous
excel.Selection.Borders(xlInsideHorizontal).Weight = xlThin
excel.Selection.Borders(xlInsideHorizontal).ColorIndex = xlAutomatic
# refit data into columns
excel.Cells.Select()
excel.Cells.EntireColumn.AutoFit()
# save new file in excel format
workbook.SaveAs(outfile, FileFormat=1)
workbook.Close(False)
excel.Quit()
del excel
अद्यतन:
शायद त्रुटि बिट पर स्पष्टीकरण का एक सा की आवश्यकता है। एक ही फाइल पर, समान कोड के साथ, मेरी टेस्ट मशीन पर दो समान रन, एक ही परिणाम उत्पन्न करते हैं। एक रन प्रत्येक xlInsideVertical
लाइन के लिए अपवाद फेंकता है। दूसरा xlInsideHorizontal
के लिए अपवाद फेंकता है। अंत में, एक तीसरा रन बिल्कुल अपवाद के साथ पूरा करता है।
जहाँ तक मैं बता सकता हूं एक्सेल इस सामान्य व्यवहार को मानता है, क्योंकि मैं एक्सेल के मैक्रो जनरेटर द्वारा निर्मित वीबी कोड क्लोन कर रहा हूं, किसी व्यक्ति द्वारा उत्पादित वीबी कोड नहीं। यह निश्चित रूप से एक गलत धारणा हो सकती है।
यह ब्लॉक को छोड़कर एक कोशिश में लिपटे प्रत्येक पंक्ति के साथ काम करेगा, मैं बस कुछ छोटा और अधिक स्पष्ट चाहता था, क्योंकि 20 लाइनों को अपने स्वयं के प्रयास में लपेटकर पकड़ने की लूप बस बाद में परेशानी के लिए पूछ रही है।
Update2:
इस परीक्षण के लिए एक झाड़ी CSV फ़ाइल है: gist file
निष्कर्ष:
Vsekhar द्वारा प्रदान की जवाब एकदम सही है। यह अपवाद दमन को दूर करता है, ताकि बाद में, यदि मेरे पास समय हो, तो मैं वास्तव में अपवादों के साथ व्यवहार कर सकता हूं। यह अपवादों को लॉगिंग करने की भी अनुमति देता है ताकि वे गायब न हों, अन्य अपवाद को रोक नहीं रहा है, और अब से छह महीने आसानी से प्रबंधित करने के लिए पर्याप्त छोटा है।
इसे पहली जगह में असफल होने के बारे में कैसे? पाइथन PHP या विजुअल बेसिक नहीं है और दुर्भाग्यवश यह सिन त्रुटि प्रबंधन को लागू करता है :( –
क्या आप सभी कॉलों को सूची में सहेज सकते हैं और फिर लूप में एकल प्रयास कथन के साथ उन पर फिर से सक्रिय हो सकते हैं? बस यह नहीं जानना कि इसे कैसे "सहेजना" कॉल की तरह। – rplnt
@ आरपीआईएनटी: कथन पाइथन में प्रथम श्रेणी की वस्तुएं नहीं हैं - उन्हें चर के लिए असाइन नहीं किया जा सकता है और कार्यों में पारित किया जा सकता है –