現在、私は以下のことをするスクリプトを持っています。私は行のテキストファイルがある場合:検索と置換のpythonスクリプトを拡張してコマンドラインから変数を受け入れる方法は?
<<Name>> is at <<Location>>.
<<Name>> is feeling <<Emotion>>.
をスクリプトは、コマンドライン引数としてこの入力ファイルに取ると変数をユーザに促すメッセージが表示されます:名前が唯一であることを
Name? Bob
Location? work
Emotion? frustrated
注意一度尋ねたまた、スクリプトは引数として出力ファイルを取り込み、ファイルに次のものを格納します。
Bob is at work.
Bob is feeling frustrated.
は今、私は、コマンドラインから入力変数(私はすでにそれをお願いするつもりだった知っていたかのように)できるように、スクリプトを拡張しようとしています。したがってコマンドは(この場合)のようになります。
python script.py infile outfile Bob work frustrated
これは同じ出力を生成します。理想的には、コマンドラインに置かれた変数の後に残っている変数が残っている場合は、残りの変数をユーザーにプロンプトする必要があります。私は、スクリプトを実行するのであれば:
python script.py infile outfile Bob work
スクリプトはまだ促す:コマンドラインで
Emotion?
過剰変数は無視されます。私はPythonにはまだまだ慣れていないので、これはかなりシンプルなようですが、現在のスクリプトをこのアドオンで更新することは成功していません。添付されているスクリプトは:
import argparse
from os import path
import re
replacements = {}
pattern = '<<([^>]*)>>'
def user_replace(match):
## Pull from replacements dict or prompt
placeholder = match.group(1)
if placeholder in replacements:
return replacements[placeholder]
## .setdefault(key, value) returns the value if present, else sets it then returns
return replacements.setdefault(placeholder, raw_input('%s? ' % placeholder))
def main():
parser = argparse.ArgumentParser()
parser.add_argument('infile', type=argparse.FileType('r'))
parser.add_argument('outfile', type=argparse.FileType('w'))
args = parser.parse_args()
matcher = re.compile(pattern)
for line in args.infile:
new_line = matcher.sub(user_replace, line)
args.outfile.write(new_line)
args.infile.close()
args.outfile.close()
if __name__ == '__main__':
main()
編集:上記の入力ファイルの例は任意です。実際には、入力ファイルは任意の数の変数を持つことができ、任意の回数繰り返します。
最初のビットをループする方法はありますか。それで、任意の数の引数に対して機能するでしょうか?上記の名前、場所、感情のビットは単なる例でした。実際には、ユーザーにはもっと多くの引数があるかもしれません。 –
私はあなたが何を望んでいるのか分からないが、推測で私の答えを更新した。 – agf
私の考えは、入力ファイルに新しい行を追加するとします: <>は<になりました> それは次のようになりますので その後、同じスクリプトを使用して、私は、次の4つの引数を書くことができます:「ボブOUTFILEのpython script.pyのINFILEは挫折党の仕事」 出力は次のようになります。 「ボブは仕事です。 ボブは不満を感じています。 ボブは現在パーティーにいます。 –