2013-06-05 8 views
5

मेरे पास अनियंत्रित संख्याओं के साथ एक लॉग फ़ाइल है। मुझे बस इतना करना है कि निकालने के लिए लॉग फ़ाइल से डेटा की एक पंक्ति है जो एक स्ट्रिंग "कुल" से शुरू होती है। मुझे फाइल से कोई अन्य लाइन नहीं चाहिए।लॉग फ़ाइल पार्सिंग पाइथन

मैं इसके लिए एक साधारण पायथन प्रोग्राम कैसे लिखूं?

यह कैसे मेरे इनपुट फ़ाइल

TestName  id   eno   TPS  GRE   FNP 
Test 1205 1   0   78.00  0.00   0.02 
Test 1206 1   0   45.00  0.00   0.02 
Test 1207 1   0   73400  0.00   0.02 
Test 1208 1   0   34.00  0.00   0.02 

Totals  64   0   129.61  145.64  1.12 

मैं कोई आउटपुट फ़ाइल जो लगता है कि

TestName  id  TPS   GRE 
Totals  64  129.61  145.64 

ठीक है .. तो मैं चाहता था पाने के लिए कोशिश कर रहा हूँ लग रहा है केवल 1st, 2nd, 4 और इनपुट फ़ाइल से 5 वां कॉलम लेकिन दूसरों को नहीं। मैं इसे प्राप्त करने के लिए सूची [इंडेक्स] की कोशिश कर रहा हूं लेकिन इंडेक्स एरर प्राप्त कर रहा हूं: (सूची सूचकांक श्रेणी से बाहर)। इसके अलावा 2 कॉलम के बीच की जगह समान नहीं है इसलिए मुझे यकीन नहीं है कि कॉलम को कैसे विभाजित किया जाए और उन लोगों को चुनें जिन्हें मैं चाहता हूं। क्या कोई मेरी मदद कर सकता है। नीचे दिए गए कार्यक्रम मैं प्रयोग किया जाता है

newFile = open('sana.log','r') 

for line in newFile.readlines(): 

    if ('TestName' in line) or ('Totals' in line): 

     data = line.split('\t') 

     print data[0]+data[1] 
+2

अजगर इस कार्य के लिए overkill की तरह लगता है ... grep नहीं होगा तेज हो सकता है? –

उत्तर

3
theFile = open('thefile.txt','r') 
FILE = theFile.readlines() 
theFile.close() 
printList = [] 
for line in FILE: 
    if ('TestName' in line) or ('Totals' in line): 
     # here you may want to do some splitting/concatenation/formatting to your string 
     printList.append(line) 

for item in printList: 
    print item # or write it to another file... or whatever 
1
for line in open('filename.txt', 'r'): 
    if line.startswith('TestName') or line.startswith('Totals'): 
     fields = line.rsplit(None, 5) 
     print '\t'.join(fields[:2] + fields[3:4]) 
संबंधित मुद्दे