如果这篇文章很长,我很抱歉,但我想尽可能详细。我已就该主题做了大量研究,并认为自己是一名“中级”技术程序员。
我的问题:我有一个包含多行数据的文本文件。我想删除每一行的某些部分,以便删除一些不相关的信息,然后用新格式化的行保存文件。
这是我想要完成的一个例子。原始行类似于:
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]中没有任何内容。我很感激我能得到的任何帮助。
答案 0 :(得分:2)
一些可能的原因:
您可以单独尝试print
您的线路以查看问题发生的位置:
for line in input_file:
print("Got line: %s" % (line))
line = line.split("extended ", 1)[1]
哦, last 行可能是空白的,而且它失败了。很容易错过。
答案 1 :(得分: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
答案 2 :(得分: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)
...
...
>>>