मैं एक लेखा पेड़ है कि स्रोत में इंडेंट/रिक्तियों के साथ संग्रह किया गया है के आधार पर पदानुक्रम पार्स करने के लिए कैसे:अजगर के साथ इंडेंट
Income
Revenue
IAP
Ads
Other-Income
Expenses
Developers
In-house
Contractors
Advertising
Other Expenses
स्तरों की एक निश्चित संख्या में हैं, इसलिए मैं समतल करना चाहते हैं
for rownum in range(6,ws.max_row+1):
accountName = str(ws.cell(row=rownum,column=1).value)
indent = len(accountName) - len(accountName.lstrip(' '))
if indent == 0:
l1 = accountName
l2 = ''
l3 = ''
elif indent == 3:
l2 = accountName
l3 = ''
else:
l3 = accountName
w.writerow([l1,l2,l3])
:
L1 L2 L3
Income
Income Revenue
Income Revenue IAP
Income Revenue Ads
Income Other-Income
Expenses Developers In-house
... etc
मैं खाता नाम से पहले स्थानों की संख्या की जाँच करके ऐसा कर सकते हैं: 3 क्षेत्रों का उपयोग करके पदानुक्रम (वास्तविक डेटा 6 स्तर, उदाहरण के लिए सरल बनाया गया है)
क्या यह पिछले पंक्ति की तुलना में वर्तमान पंक्ति के इंडेंटेशन के आधार पर इसे प्राप्त करने के लिए एक और अधिक लचीला तरीका है, यह मानते हुए कि यह हमेशा 3 रिक्त स्थान प्रति स्तर है? L1
में हमेशा कोई इंडेंट नहीं होगा, और हम भरोसा कर सकते हैं कि निचले स्तर को उनके माता-पिता से आगे इंडेंट किया जाएगा, लेकिन शायद प्रति स्तर 3 स्पेस नहीं हो सकता है।
अद्यतन, तर्क के मांस के रूप में इसके साथ समाप्त हुआ, क्योंकि आखिरकार मैं सामग्री के साथ खाता सूची चाहता था, यह तय करने के लिए इंडेंट का उपयोग करना आसान था कि सूची को रीसेट, संलग्न या पॉप करना है:
if indent == 0:
accountList = []
accountList.append((indent,accountName))
elif indent > prev_indent:
accountList.append((indent,accountName))
elif indent <= prev_indent:
max_indent = int(max(accountList,key=itemgetter(0))[0])
while max_indent >= indent:
accountList.pop()
max_indent = int(max(accountList,key=itemgetter(0))[0])
accountList.append((indent,accountName))
तो आउटपुट की प्रत्येक पंक्ति पर खातासूची पूरी हो गई है।
इस के लिए धन्यवाद, मैं अंत में उत्पादन करने में सक्षम होना चाहते थे लाइन की सामग्री के साथ-साथ प्रत्येक पंक्ति में पदानुक्रम, तो मैं थोड़ा संशोधित, लेकिन यह मुझे सही दिशा में शीर्षक मिला। –