Python:在文本fi中重新格式化多行

2024-03-29 10:17:17 发布

您现在位置:Python中文网/ 问答频道 /正文

如果这篇文章很长,我很抱歉,但我会尽量详细。我对这个主题做了大量的研究,认为自己是一个“中级”熟练的程序员。

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

这是一个我正在努力实现的例子。最初的台词是这样的:

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

我试图让代码读取文本文件,并输出:

^{pr2}$

以下代码有效,但仅当文本文件中只有一行时:

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]中没有任何内容。如果能帮上忙我会很感激的。


Tags: 文件数据代码extendedhostinputoutputline
3条回答

当你遇到无法处理的行时打印出一些内容

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

一些可能的原因:

  • 文件中有空行(空白行显然不包含扩展的单词extended
  • 您的行不是空白的,但不包含单词扩展的

您可以尝试print分别查看问题发生的位置:

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

哦,有可能最后一行是空的。很容易错过。在

另一种方法是缓存所有行(假设文件不是很庞大)

>>> 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)
...     
... 
>>> 

相关问题 更多 >