2011-08-05 14 views
0

私は条件付きの追加を実行するためにテキストファイルに苦労している/ Pythonを使用して特定のテキストを拡張しています。 (条件付きでの追加Python

コード(添付)に関しては、「記述」を含む文の下に文「mtu 1546」を追加する必要があります。それは存在しません。また、私は、インターフェイスステートメント(および/または上記のmtuステートメント、利用可能な場合)の下に "記述TEST"ステートメントを追加できるようにしたいと思います。私はPython 2.7を使用しています。

ここで

だ私のコードです:それは正しく興味深いラインを印刷することができますよう

import re 

f = open('/TESTFOLDER/TEST.txt','r') 
interfaces=re.findall(r'(^interface Vlan[\d+].*\n.+?\n!)',f.read(),re.DOTALL|re.MULTILINE) 

for i in interfaces: 
    interfaceslist = i.split("!") 
    for i in interfaceslist: 
     if "mtu" not in i: 
      print i 


f.close() 

print文は、条件で正常に動作しますしかし、私の必要条件は、必要な文をリストに追加(追加/拡張)して、構文解析や処理にそれをさらに使用できるようにすることです。 append/extend関数を試してみると、インタプリタは文字列オブジェクトであると解釈します。サンプルソースファイル(テキスト)は次のとおりです。私が解析するテキストファイルはサイズが大きいので、興味深いテキストを追加するだけです。

! 
interface Vlan2268 
description SNMA_Lovetch_mgmt 
mtu 1546 
no ip address 
xconnect 22.93.94.56 2268 encapsulation mpls 
! 
interface Vlan2269 
description SNMA_Targoviste_mgmt 
mtu 1546 
no ip address 
xconnect 22.93.94.90 2269 encapsulation mpls 
! 
interface Vlan2272 
mtu 1546 
no ip address 
xconnect 22.93.94.72 2272 encapsulation mpls 
! 
interface Vlan2282 
description SNMA_Ruse_mgmt 
no ip address 
xconnect 22.93.94.38 2282 encapsulation mpls 
! 
interface Vlan2284 
mtu 1546 
no ip address 
xconnect vfi SNMA_Razgrad_mgmt 
! 
interface Vlan2286 
description mgmt_SNMA_Rs 
no ip address 
xconnect 22.93.94.86 2286 encapsulation mpls 
! 
interface Vlan2292 
description SNMA_Vraca_mgmt 
mtu 1546 
no ip address 
xconnect 22.93.94.60 2292 encapsulation mpls 
! 
+0

をあなたは私がループの両方で変数を使用していたことに気づいたことがありますか? :) –

+0

実際、Pythonはそれが別の変数だと認識していますが、人間の読者にとっては混乱します。 –

+0

マイケルに感謝します。それは私が心に持っていたものです。 – user531942

答えて

1

あなたの質問に対する基本的な回答は非常に簡単です。文字列は不変なので、appendまたはextendにはできません。連結を使用して新しい文字列を作成する必要があります。

>>> print i 
interface Vlan2286 
description mgmt_SNMA_Rs 
no ip address 
xconnect 22.93.94.86 2286 encapsulation mpls 

>>> print i + ' mtu 1546\n' 
interface Vlan2286 
description mgmt_SNMA_Rs 
no ip address 
xconnect 22.93.94.86 2286 encapsulation mpls 
mtu 1546 

結果を変数名または何らかの種類のコンテナに保存する必要があります。あなただけので、私にそれを好き救うことができる:

i = i + ' mtu 1546\n' 

かそこらのような:

i += ' mtu 1546\n' 

しかし、この場合には、リストの内包が役に立つかもしれない...

def add_mtu(i): 
    return i if "mtu" in i else i + " mtu 1546\n" 

for iface in interfaces: 
    interfaceslist = iface.split("!") 
    updated_ifaces = [add_mtu(i) for i in interfaceslist] 

注意をわかりやすくするために最初のiifaceに置き換えました。また、ifaceは現在interfacesに1つしか表示されていません。おそらくあなたはforループを必要としますが、もしそうでなければ、それを削除する事を単純化します。

+0

ありがとうたくさんのセンダーレ、それは素晴らしい見えます!私はすぐにそれを試してみましょう..再度ありがとう.. – user531942

+0

senderle - それはMTUと素晴らしい作品..どのように説明文とMTUと一緒になりますか?コードのその部分をどのように統合するのですか?そのために別の機能を作成する必要がありますか?任意のコードが評価されます。私は、文 "mtu"または "description"のいずれかがテキストファイルまたはその両方に存在しない場合があります。もう一度お手数ですが – user531942

+0

あなたは現在の 'add_mtu'関数を変更することができます。 '' if if 'mtu in ... ''の結果を返すのではなく、それを変数名に保存して、記述と同じことをします。 – senderle

1

ファイル全体読み取ることができた場合:

import re 

f = open('/TESTFOLDER/TEST.txt','r') 
text = f.read() 

text = re.sub(r"(?m)(^interface Vlan\d+.*\n(?! description)", r"\1 description TEST\n", text) 
text = re.sub(r"(?m)(^interface Vlan\d+.*\n description .+\n)(?! mtu)", r"\1 mtu 1546\n", text) 
+0

魅力のように動作します:)それほど感謝しています..ありがとう、本当に! – user531942

関連する問題