• ベストアンサー

pythonで作成する読み込みファイル内の設定項目変更

(1)IPアドレスが複数書いてある設定ファイルを読み込ませた際に、規定のファイル名に書き換える。  (2)規定ファイル名に書き換えたファイルの特定の部位(例えば5-10行目だけ)をIPアドレスの設定数分ループさせる処理。 pythonでの書き方が分からなくて 御存じの方がいらっしゃったら教えてください。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

なんかアヤシイCプログラムですが、 Pythonで書くとおおむねこんな感じになります。 template_string = '$script start vifnum=%d bridge=xenbr%d netdev=eth%d' wf = open('network-bridge_xen.txt', 'w') max_count=10 for i in range(0, max_count+1): ____print >>wf, template_string % (i, i, i) wf.close() 出力ファイルの中身はこう。 $script start vifnum=0 bridge=xenbr0 netdev=eth0 $script start vifnum=1 bridge=xenbr1 netdev=eth1 $script start vifnum=2 bridge=xenbr2 netdev=eth2 $script start vifnum=3 bridge=xenbr3 netdev=eth3 $script start vifnum=4 bridge=xenbr4 netdev=eth4 $script start vifnum=5 bridge=xenbr5 netdev=eth5 $script start vifnum=6 bridge=xenbr6 netdev=eth6 $script start vifnum=7 bridge=xenbr7 netdev=eth7 $script start vifnum=8 bridge=xenbr8 netdev=eth8 $script start vifnum=9 bridge=xenbr9 netdev=eth9 $script start vifnum=10 bridge=xenbr10 netdev=eth10

vis3sock
質問者

お礼

お恥ずかしい限りのC言語を晒してしまいましたm(_ _)m お影で、丁寧に対応して頂いて本当にありがとうございます! templateの使い方や組み方など、教えていただいて大感激でした。

その他の回答 (2)

回答No.2

なんか丸投げのにおいを感じたんだけど気のせい?w まだよくわからないんだけど、 case ${OP} in start) $script start vifnum=0 bridge=xenbr0 netdev=eth0 $script start vifnum=1 bridge=xenbr1 netdev=eth1 $script start vifnum=2 bridge=xenbri netdev=dummy0 ;; スクリプトのこういう部分(stop と statusも)を、用意しているIPアドレス(=インターフェース)の数だけ 自動的に番号を振って生成したいということでしょうか? であれば、IPアドレスを列挙しているファイルを読み込んで、 空行とかコメント行を除いた数-1まで0から数え上げていけばいいのでは? 文字列の置き換えは、stringクラスに replaceメソッドがありますからそれを使えばよいです。 正規表現を使いたいなら re,sub('検索パターン', '置換文字列', 対象の変数) などが使えます。 Pythonにはsprintfやprintfはありませんが、 "vifnum=%d bridge=xenbr%d netdev=eth%d" % (0, 0, 0) のようにすれば同様の結果が得られます。 ファイルのオープンの仕方などはマニュアル見ればすぐわかることなので省略します。

vis3sock
質問者

お礼

どういったコーディングをすれば、期待値を得られるのか。 フローも組めていない状態でした。 分かりにくい伝え方しかできなくてすみませんです。 >自動的に番号を振って生成したいということでしょうか? それです! 仮想化用の network-bridge.xenを作成したさいの start) $script start vifnum=0 bridge=xenbr0 netdev=eth0 : この部分のみ複数所持するIPアドレス数分ループさせたかったのです。 C言語で例えるなら(すみません(>_<)!!) int main(void) { ___FILE *fp; ___short buf[512] ___int i; ___int max=3; __fp=open("network-bridge_xen.txt","w"); ____if(fp=NULL) ___return 0; __fread(buf, sizeof(short),100,fp); ____if( buf ==vifnum=0 bridge=xenbr0 netdev=eth0) ____{ _____for(i = 0; i = max; i++) _____{ _______fprintf(fp, "vifnum=%d __________________bridge=xenbr%dnetdev=eth%d\n",i,i,i); ______} _____} } pythonでの書き方が分からなかったのです。 ずうずうしくも・・・・ re,sub('検索パターン', '置換文字列', 対象の変数)なら re.sub('vifnum=%d…','vifnum=%d…','vifnum=%d…' %0) ですか?

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

もうちょっと具体的な例を挙げもらえますか? たとえば設定ファイルの書式が 127.0.0.1 192.168.0.1 192.168.15.127 のようになっているとか、「規定のファイル名に書き換える」 というのはどういう操作なのか。とか 127.0.0.1 → localhost のようなもの? (2)の方もどういう動作なのかよくわかりません。

vis3sock
質問者

補足

すみません。分かりにくいですよね。 具体的には・・・ (1) [ /scripts]pwd /etc/xen/scripts scriptsの中にある「network-bridge」スクリプトの名前を「network-bridge.xen」に変更する。 (2)変更されたnetwork-bridge.xenの中に書き込まれる情報は以下URLを参考にnetwork-bridge.xenを作成し、 start,stop,status項目に対してそれぞれ所持するIPアドレス分(eth0~ethX)設定項目を書き込みたい。 (概要→「xenbr0」と「xenbr1」はそれぞれ物理デバイスのeth0とeth1に関連づけられ domaiU(仮想化)のネットワークもeth0とeth1と関連つければdomaiU(仮想化)でも外部と通信化となれる。) このときのstart,stop,status項目に対してそれぞれ所持するIPアドレス分(eth0~ethX)設定項目を書き込みたいのです。 なお、IPアドレスはあらかじめ[number]に格納している状態で >設定ファイルの書式は >127.0.0.1 >192.168.0.1 >192.168.15.127 まさしくそうです! 3個あるIPアドレス情報→numberに格納されている。 よろしくお願いいたします。 以下の情報を元に作成しております。 http://itpro.nikkeibp.co.jp/article/COLUMN/20061010/250215/?P=3&ST=virtual

関連するQ&A

  • ホスト名からIPアドレスを検索、設定するバッチファイルを作成したいです

    ホスト名からIPアドレスを検索、設定するバッチファイルを作成したいです。。 まず、下記の内容のようなテキストがあります。(仮に『a.txt』とします) ----------------------- ホスト名1 IPアドレス1 ホスト名2 IPアドレス2 ホスト名3 IPアドレス3 ホスト名4 IPアドレス4 … ----------------------- 処理としては、 バッチ叩く→ 叩いた端末のホスト名で『a.txt』内を検索→ → 同じ行のIPを抽出 →IP設定変更 →完 を目指しています。 同じ行のIPを抽出するところで躓いてしまいました…。 良いアイデアはありませんでしょうか。 よろしくお願いします!

  • pythonで設定範囲を超えた場合のエラー処理方法

    pythonで設定範囲を超えた場合のエラー処理方法が分かりません。参考になるソースや参考例を御存じの方がいらっしゃいませんか? 具体的には、IPアドレス等(NETMASK,GATEWAY)のmax255.255.255.255の数値が[0-255]までの設定数値ならOKで それ以外であればエラーにするといった処理がPythonで書けなくて困っております。 今回はIPv4のみであるので、4つのいずれか一つでも[0-255]を超えるならばエラー処理をさせたいのです。 お心当たりのある方お願いいたします。

  • デバッグ中に停止したファイルの削除(Python)

    Python (PyScripter / Windows7)でプログラムを組んでいます。 デバッグ中なので、度々実行中に落ちてしまうのですが その際に開いていたファイルが消せなくなって困っています。 (Pythonに限らないかもしれませんが) 削除しようとするとPython.exeが使用中のためファイルを消せないというメッセージが出ます。 なにかよい設定方法などがあるでしょうか? よろしくお願いします。

  • python初心者です。csvファイルを扱いたいんですが...

    すいません、python初心者ですので、気長に聞いてくださいcsvファイルの10番目のカラムの人数を合計したんです。1行目のフィールドはカラム名なので飛ばして2行目から読み込みたいんですが、結果が出てきません。一応書いたプログラムは、 #!usr/bin/env python import sys import string i = 0 for line in open('./data.csv').readlines(): item = string.split(line,',') if item[9].isdigit(): i+=int(item[9]) print i です。処理速度を早くしたいのでdictionaly化せずに行いたいんですが、誰かご教授願えませんか?

  • python 外部ファイルのテキスト処理について

    お世話になります。 python を使用して、あるディレクトリ中にあるテキストファイル(ひな形ファイル、複数行)を読み込んで、 これに対してリストやタプル、ディクショナリなどに入った値を連続的に変化させた複数のアウトプットファイルを同一ディレクトリに生成する、という作業を考えています。 たとえばですが、外部のひな形ファイルに ${list1}番のファイル ${list2}のデータ データコード、データ名一覧 -------------+---------- ${list3} -------------+---------- などと作っておきます。{}内はプレースホルダのようなものですがこの形式でなくてもかまいません。 ここに、別途処理して${list2}、${list2}、${list3}を置き換えたファイルを、ファイル番号毎に生成する、というような作業です。 ここで、テキストの単純な置換ならば、stringモジュールのTemplateクラスなどの利用があるようですが、このような複雑な置換にはどう対応していいか分かりません。 上の例で言うと、たとえばlist3には、別の外部ファイルにあるデータ番号、データ名をタプルなどに読み込んで、それを1行ずつ流し込むことをやりたいので、このモジュールの使用は難しそうです。 他に自分で考えた方法としては、ひな形ファイルをファイルオブジェクトとして読み込んで、forを使って順番に処理していく方法ですが、これだとファイルのシーク位置がおかしくなったり、何度も同じような処理が連続してしまってうまくコードに出来ませんでした。 まだプログラミング自体に慣れていませんが、コーディング自体は自分でがんばりますので、方針を教えていただけますとうれしいです。 もし分かりづらかったら補足要求お願いします。

  • ファイルの読み込みと置き換え

    Perlでテキストファイルを読み込み、テキストの一部を置き換えをするというプログラムを作っています。 用意されているテキストファイルは複数行あるもので、リスト作成ツールのフリーソフトにより作成されています。 目的はファイルを読み込み、一行一行中を見て特定の文字を置き換えて、最後に配列に一行一行いれていくというものです。 逆に配列に一度いれて一個一個置き換えてもOKで、結果が同じならばOKです。 以下にそのプログラムを書きます。 ############################## open(IN,"list.txt") || die "ファイルが見つからないので終了します。"; @file = <IN>; $count=@file; while(<IN>){ $_=~s/xls/エクセルファイル/; print "置き換え中!残りあと$count行です\n"; $count-- } close(IN); print"@file[18]","\n"; ############################## 最後の行で置き換えが成功したか見てますが、これを実行しても何も表示されません。 もちろん行数は18行どころか100行くらいあります。 たぶん配列の入れるタイミングとか何かが間違っていると思うのですが、どこで間違っているのかがよくわかりません。 教えていただけると助かります。

    • ベストアンサー
    • Perl
  • ファイル読み込みが上手くできません

    C言語初心者です。 現在、ファイルの情報を構造体に読込んで実行するプログラムを作成しております。 読込むファイルは700MBほど(行数は39900000行)となっており、1行ずつfscanfで読込んでいます。 400000行ごとに構造体に読込んで、処理を実行し、構造体に読込んだ全ての処理が完了したら、再度400000行読込んで・・・を繰り返すものになっております。 400000行ごとにしているためforループで100回まわすようにしているのですが、最後の1回(100回目のループ)で、99回目と同じ場所を読んできてしまいます。 つまり、最後の1回だけはファイルポインタが進んでいない状況になります。 コードは下記になります。 #define MAX_SIZE 400000 uint64_t i = 0; uint64_t fc = 0; int main(int argc, char *argv[]){ char w[] = "$write"; char r[] = "$read"; // ファイルを構造体へ格納 char filename[] = "TEST_READ_WRITE.txt"; struct TEST_DATA{ char cmd[10]; int addr; int bsize; }; FILE *fp; if ((fp = fopen(filename, "r")) == NULL){ printf("%s open error !\n", filename); exit(1); } for (int lp = 0; lp < 100; lp++){ struct TEST_DATA TD[MAX_SIZE]; // 構造体配列の宣言 for (fc = 0; fc < MAX_SIZE; fc++) { if (feof(fp)){ break; } else{ fscanf(fp, "%s %d %d\n", TD[fc].cmd, &TD[fc].addr, &TD[fc].bsize); } } while (i < MAX_SIZE - 1){ //ファイルから取得したデータによって処理を実行 if (strcmp(TD[i].cmd, w) == 0){ //書込み処理 } if (strcmp(TD[i].cmd, r) == 0){ //読み込み処理 } } printf("Finish!! \n"); } fclose(fp); return 0; } 読込むファイルはテキストデータで、 $write 25651496 152 $write 135878112 8 $read 1244848 16 のような感じのものが39900000行並んでいるものになります(数字はランダムです)。 最後の1回のみ上手くファイルポインタが進まない原因が分からずに困っています。 お気づきの方がいらっしゃいましたら、アドバイスをよろしくお願いします。

  • PDFの一括ファイル名変更について

    現在、日付がファイル名になっているPDFが1000ほどあります(それぞれは20ページほど)。 その大部分はヘッダ部に通し番号、本文一ページ目の一行目に題名があります。 一括処理にてリネームを行いたいのですが、その際、各PDFファイルの内容の一行目を、現在のファイル名に追加するようにできませんでしょうか? ツール等あれば教えてください。 よろしくお願いします。

  • 「ファイルを開く」の表示設定変更、保存について

    OSはWindowsXP Professional SP2 です。 エクスプローラ上ではマイピクチャや写真用のフォルダを除き、「詳細」で表示しているのですが、アプリケーション左上の「ファイル」>「開く」を選択した際に出てくるウィンドウ「ファイルを開く」では一覧表示となってしまいます。(特定のアプリケーションにかかわる問題ではなく、複数のアプリケーションを使っても同様の挙動をとります。) また、右上の表示設定アイコンより「詳細」に切り替えても次に開くときは又「一覧」に戻ってしまいます。 「ファイルを開く」の表示設定をエクスプローラと同一にする、あるいは設定を保存する方法がありましたら教えてください。

  • バッチファイルの作成について教えてください

    初めまして。 一定の処理を定期的に行うバッチファイルを作成したいのですが、どうにも素人で完成させることができません。 もしご存知の方がいらしたら、ぜひ教えていただけないでしょうか? 行いたい処理の内容は以下になります。 処理1 1. 特定のURLを開く (ブラウザは何でも可) (例: URL: http://www.xxx.jp) そのURLは特定のファイルを指定するもので、アクセスにはユーザー名/パスワードが必要   (例: ユーザー名: user, パスワード: pass) 2. あらかじめ記憶させたユーザー名/パスワードでファイルを特定のフォルダ保存   (例: 特定フォルダ名: C:\Folder\Data\) 処理2 1. 処理1を、毎日午前8時と午後3時に自動実行 どなたか教えていただければ幸いです。 よろしくお願いします。

専門家に質問してみよう