2012-03-13 8 views
0

を行うことができます私は、Python、「Icecastのサーバー」上でスクリプトを書かれている、と私はこのような「/etc/icecast2/icecast.xml」にいくつかの文字列を変更:Pythonスクリプトどのようにそれが短い

import os,sys,re 
def ices2(): 
    changedir=open(pathh + "icecast3.xml", "w") 
    data=open("/etc/icecast2/icecast.xml").read() 
    changedir.write(re.sub("<source-password>hackme</source-password>","<source-password>123</source-password>" % x,data)) 
    changedir.close() 
ices2() 
def ices1(): 
    changedir1=open(pathh + "icecast2.xml", "w") 
    data=open(pathh + "icecast3.xml").read() 
    changedir1.write(re.sub("<relay-password>hackme</relay-password>", "<relay-password>123</relay-password>" % x,data)) 
    changedir1.close() 
    os.remove(pathh + "icecast3.xml") 
ices1() 
def ices(): 
    changedir2=open("/etc/icecast2/icecast.xml", "w") 
    data=open(pathh + "icecast2.xml").read() 
    changedir2.write(re.sub("<admin-password>hackme</admin-password>","<admin-password>123</admin-password>" % x,data)) 
    changedir2.close() 
    os.remove(pathh + "icecast2.xml") 
ices() 

。しかし、それはスクリプトのためには長すぎます。どのように私はそれを短縮することができますか?私は1つのファイルでいくつかの変更を行い、変更を加えてそれを開いて、失われたデータなしで閉じる必要があります。私はそれが1つの機能で実行できることを知っていますが、それを行う方法はわかりません。

def ices(): 
    changedir=open(pathh + "icecast3.xml", "w") 
    data=open("/etc/icecast2/icecast.xml").read() 
    changedir.write(re.sub("<source-password>hackme</source-password>","<source-password>123</source-password>",data)) 
    changedir1.write(re.sub("<relay-password>hackme</relay-password>", "<relay-password>123</relay-password>",data)) 
    changedir2.write(re.sub("<admin-password>hackme</admin-password>","<admin-password>123</admin-password>",data)) 
    changedir.close() 

私は1つの関数にそれをやったと上のものより私のスクリプトの短い:

は、私はこのような1つの関数に3つの変更を必要としています。しかし、それは間違っている私は

changedir=open(pathh + "icecast3.xml", "w") 
data=open("/etc/icecast2/icecast.xml").read() 
ここ

私は新しいファイル「pathh + 『icecast3.xml』(pathh- /ホーム/ユーザー/ダウンロード)を作成し、それを正しく行う必要がありますが、私は、ファイル開く必要があります。

をあなたが一つにそれらを結合することができますので、それを読んで、同じファイルに変更を書き込む
"/etc/icecast2/icecast.xml" 

...。

答えて

2

すべての3つの関数が同じことを行う。これは完全な解決策はありませんが、私はあなたがここから上に行くことができると考えてあなた自身で:

import os,sys,re 
def ices(in_path, out_path, remove=False): 
    changedir = open(out_path, "w") 
    data = open(in_path, 'r') 
    changedir.write(re.sub("<source-password>hackme</source-password>","<source-password>123</source-password>" % x,data.read())) # this is wrong as well but I take it as an example 
    changedir.close() 
    data.close() 
    if remove: 
     os.remove(in_path) 

あなたはこの関数を呼び出すことができます。

ices(base_path + 'icecast2.xml', base_path + 'icecast3.xml', True) 

ヒント:

  • それは(文字列連結ではなく)完全なパスを作成するためのos.path.joinを使用することをお勧めします

  • 外観with statementにあり、読みやすくするためにそれを使用しているcosider

EDIT(コメントで明確化を尊重):私は、書き込み中に別の文字列を逃した

申し訳ありません。

f = open(filename, 'r') 
data = f.read() 
f.close() 
for tag in ['source', 'relay', 'admin'] 
    sub_str = "<{tag_name}>%s</{tag_name}>".format(tag_name=tag+'-password') 
    data = re.sub(sub_str % 'hackme', sub_str % '123', data) 
f = open(filename+'.new', 'w') 
f.write(data) 
f.close() 
+0

私はファイルicecast.xmlを持っています。私はそれに3文字列を変更する必要があります。 1つの関数で3つのものを変更する方法はわかりません。私はファイルを開いていくつかの変更を行い、それらに書きたいと思う。 – nosensus

+0

ああ、私はそのような質問を理解していませんでした。私はしばらく編集しようとします。 – rplnt

+0

私の英語は悪いです。申し訳ありません、私は質問を変更します。 – nosensus

関連する問題