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 

次のコードは機能しますが、テキスト ファイルに 1 行しかない場合に限ります。

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という単語が含まれません)
  • 空白ではないが、 extendedという単語が含まれていない行があります

print行を個別に ing して、問題が発生した場所を確認できます。

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 に答える