2012-07-01 103 views
2

我有一個腳本,我想用它從文件中刪除包含特定IP地址的行。這是:刪除包含特定字符串的行

for line in fileinput.input(hostsFileLoc,inplace =1): 
    line = line.strip() 
    if not hostIP in line: 
     print line 

然而,這類作品有兩件事我正在努力解決。

  1. 這個腳本會刪除任何比賽,所以例如在之前

    127.0.0.1
    127.0.0.11
    127.0.0.111
    192.168.0.1

    如果我運行這個與輸入「127.0.0.11」,它將刪除「127.0.0.11」和「127.0.0.111」,這不是我想要的。

  2. 此腳本也不處理csv文件。我需要從每行只有一行的文件和每行IP地址(根據上面的列表)以及第一個字段是有問題的IP地址的csv文件中刪除它。我曾嘗試在strip函數中使用正則表達式[\s\,]+,但這不能正常工作,並在將其餘行重新打印迴文件時添加空白行。

我知道這可能有很多要問,但我仍然試圖找到解決Python奇蹟的方法。

任何想法都會受到歡迎和非常感謝。

回答

3

你只需要在你的測試中更具體。對於第一個示例測試,整行(在strip之後)等於ip地址(比它包含它更嚴格 - 因此解決了您的第一個問題)。第二,在逗號字符上分割每一行,並測試第一個元素是否等於您的IP地址字符串。

所以對於第一個文件類型:

for line in fileinput.input(hostsFileLoc,inplace =1): 
    line = line.strip() 
    if line != hostIP: 
     sys.stdout.write(line) 

和CSV文件類型:

for line in fileinput.input(hostsFileLoc,inplace =1): 
    elements = line.split(",") 
    first = elements[0].strip() 
    if first != hostIP: 
     sys.stdout.write(line) 
+0

這正是我想要的......我的理解什麼是'第一個元素= [0] .strip()'是什麼意思? – MHibbin

+0

@MHibbin:'elements'是一個csv行,分成一個'list',其中每個元素是行中的一個字段。 '元素[0]'是csv行的第一個元素。然後'.strip()'在行內容之前或之後刪除任何空格。這很重要,因爲當比較相等性時,在ip地址之前或之後的空格/製表符會使匹配成爲假。這有幫助嗎?例如, –

+0

。第一行csv有'blah,foo,bar'。 '元素'然後是'['blah','foo','bar']'。 'elements [0]'是''blah''和'elements [0] .strip()'是''blah''(注意刪除尾部後面的空格)。 –

3

如果你帶了串,你可以測試它們是否相等或沒有,而不是如果它包含輸入。

for line in fileinput.input(hostsFileLoc,inplace =1): 
    line = line.strip() 
    # Only print if they are not the same 
    if hostIP != line: 
     print line 
1

我會用正則表達式從行中提取IP地址,並根據您要查找的IP進行檢查。 ValidIpAddressRegex =「^(([0-9] | [1-9] [0-9] | 1 [0-9] {2} | 2 [0 - 4] [0-9] | 25 [0-5])){3}([0-9] |。[1-9] [0-9] | 1 [0-9] {2} | 2 [0-4] [0-9] | 25 [0-5])$」

http://docs.python.org/library/re.html

這可能是太多這樣一個簡單的任務,但除此之外,你將不得不seperatly處理每一個邊緣的情況下這可能會產生一個骯髒的和複雜的代碼。特別是如果你不得不在未來添加其他過濾器(例如像hotnames)。

至於CSV文件,爲什麼你不簡單地解析文件並刪除你想要的任何條目?

http://docs.python.org/library/csv.html

1

所以這行,我們不想要的嗎?那些包含ip地址的行!

正則表達式爲r'127\.0\.0\.1'。我們必須避開點(\.),使它們成爲字面點,因爲點在正則表達式中具有特殊含義。

但是,我們的意思是隻有那些行所在地址爲開頭(^)或者非數字(\D)後,如果後面的線($)或者非數字的結束。

這使得:r'(^|\D)127\.0\.0\.1(\D|$)'

import re 
regexp = re.compile(r'(^|\D)' + re.escape('127.0.0.1') + r'(\D|$)') 

for line in fileinput.input(hostsFileLoc,inplace =1): 
    line = line.strip() 
    if not regexp.search(line): 
     print line 
+0

我不知道我跟着你嗎? - 對不起? – MHibbin

2
for line in fileinput.input(hostsFileLoc,inplace =1): 
    line = line.strip() 
    if hostIP!=line: 
     print line 

併爲CSV文件:

for line in fileinput.input(hostsFileLoc,inplace =1): 
    line = line.strip() 
    if not line.startswith(hostIP+','): 
     print line