2012-09-06 68 views
2

我很抱歉,如果這個職位是漫長的,但我想是儘可能詳細。我對這個主題進行了大量的研究,並認爲自己是一個「中級」熟練的程序員。的Python:重新格式化多行文本文件

我的問題:我有一個多行數據的文本文件。我想刪除每行的某些部分以努力擺脫一些不相關的信息,然後用新格式化的行保存該文件。

這裏是什麼,我試圖完成一個例子。原線是一樣的東西:

access-list inbound_outside1 line 165 extended permit tcp any host 209.143.156.200 eq www (hitcnt=10086645) 0x3eb90594 

我想有代碼讀取文本文件,輸出:

permit tcp any 209.143.156.200 www 

下面的代碼工作,但前提是在單行文本文件:

input_file = open("ConfigInput.txt", "r") 
output_file = open("ConfigOutput.txt", "w") 

for line in input_file: 
    line = line.split("extended ", 1)[1] 
    line = line.split("(", 1)[0] 
    line = line.replace(" host", "") 
    line = line.replace(" eq", "") 
    output_file.write(line) 

output_file.close() 
input_file.close() 

然而,當我嘗試使用的多行數據進行完整的文件運行此,我收到一個錯誤:

File "C:\Python27\asaReader", line 5, in <module> 
    line = line.split("extended ", 1)[1] 
IndexError: list index out of range 

,我懷疑這是不是移動到數據的文本文件的下一行,因此沒有在[1]的以前的字符串什麼。我將不勝感激任何幫助。

回答

2

一些可能的原因:

  • 您的文件空行(空行顯然不會包含擴展字)
  • 您有沒有空行,但不要」牛逼包含擴展

你可以嘗試print單獨荷蘭國際集團的線,看看發生問題的話:

for line in input_file: 
    print("Got line: %s" % (line)) 
    line = line.split("extended ", 1)[1] 

哦,它有可能是最後是空白,它的失敗上。錯過很容易。

+0

每行包含單詞「extended」,文本文件中沒有空白行。它具有非常一致的格式。 – user1650583

+0

@ user1650583你能嘗試添加我只是編輯的打印語句,讓我們知道哪一行導致錯誤? –

+0

我剛剛完成了換行符的搜索功能,並在我的文件末尾找到了一個。這已經解決了這個問題(我在寫這篇文章時口頭讚美你)。 我不知道會拋出一個錯誤,但無論哪種方式,你有固定我的問題。非常感謝您的快速回復,因爲我現在可以繼續我的夜晚! – user1650583

1

打印出來的東西,當你打,不能處理

for line in input_file: 
    try: 
     line = line.split("extended ", 1)[1] 
     line = line.split("(", 1)[0] 
     line = line.replace(" host", "") 
     line = line.replace(" eq", "") 
     output_file.write(line) 
    except Exception, e: 
     print "Choked on this line: %r"%line 
     print e 
0

另一種方法是緩存所有的線線(假設該文件不是堆積如山。)

>>> with open('/tmp/ConfigInput.txt', 'rU') as f: 
...  lines = f.readlines() 
...  
... 
>>> lines 
['access-list inbound_outside1 line 165 extended permit tcp any host 209.143.156.200 eq www (hitcnt=10086645) 0x3eb90594\n'] 
>>> lines = [re.sub('(^.*extended |\(.*$)', '', line) for line in lines] 
>>> lines 
['permit tcp any host 209.143.156.200 eq www \n'] 
>>> with open('/tmp/ConfigOutput.txt', 'w') as f: 
...  f.writelines(lines) 
...  
... 
>>> 
+0

有趣的方法。我會試一試,看看哪個表現更好;該文件是巨大的;) – user1650583