2

如果这篇文章很长,我深表歉意,但我试图尽可能详细。我已经对该主题进行了大量研究,并且认为自己是一个“中级”熟练的程序员。

我的问题:我有一个包含多行数据的文本文件。我想删除每行的某些部分以消除一些不相关的信息,然后使用新格式化的行保存文件。

这是我想要完成的一个例子。原行是这样的:

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] 中没有任何内容。我会很感激我能得到的任何帮助。

4

3 回答 3

2

一些可能的原因:

  • 您的文件中有空行(空白行显然不包含extended一词)
  • 您有非空白行,但不包含扩展字

您可以尝试print单独检查您的线路以查看问题发生在哪里:

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

哦,最后一行可能是空白的并且它失败了。很容易错过。

于 2012-09-06T01:41:29.173 回答
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
于 2012-09-06T01:45:34.270 回答
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)
...     
... 
>>> 
于 2012-09-06T02:26:19.197 回答