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 地址的文件中删除它,还需要一个 csv 文件,其中第一个字段是有问题的 IP 地址。我曾尝试[\s\,]+在 strip 函数中使用正则表达式,但这不能正常工作,并且在将剩余行重新打印回文件时会添加一个空行。

我知道这可能有很多问题要问,但我仍在努力寻找绕过 Python 奇迹的方法。

4

5 回答 5

3

您只需要在测试中更加具体。对于第一个示例测试,整行(在一条带之后)等于 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)
于 2012-07-01T20:40:19.150 回答
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
于 2012-07-01T20:42:17.993 回答
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
于 2012-07-02T11:27:25.750 回答
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

对于这样一个简单的任务来说,这可能太多了,但否则,您将不得不单独处理每个边缘情况,这可能会产生肮脏和复杂的代码。特别是如果您将来必须添加其他过滤器(例如热名称)。

至于 CSV 文件,您为什么不简单地解析文件并删除您想要的任何条目?

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

于 2012-07-01T20:52:57.623 回答
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
于 2012-07-01T20:57:57.320 回答