2011-09-14 4 views
1
argc = len(sys.argv) 

if (argc < 3 or argc > 5): 
    printusage() 
    sys.exit() 

insensitive = 1 if ("-i" in sys.argv) else 0 
boundaries = 1 if ("-b" in sys.argv) else 0 

filename = sys.argv[argc-2] 
str = sys.argv[argc-1] 

print "Looking for '", str , "' in '" , filename , "'" 

出力はなぜsys.argv []にスペースがありますか?

パイソンcount_words.py -b -i football.txt目標があるのはなぜ

'football.txt' の '目標' をお探し

です「目標」と「football.txt」前後のスペース? 文字列のファイル名を単独で変数に出力しようとすると、これらの空白がありません。

私はまた、プリントでstr.strip()を使ってみましたが効果はありません。

アイデア?

+0

Pythonで 'if 5 rplnt

+0

5

答えて

7

スペースがsys.argvではありませんが、それが原因で発生し印刷時のコンマの使用。お試しください

strのシャドーイングを避けてください。

0

印刷では、引数をスペースで区切ります。 str.formatの使用を改善する。

3

あなたのprintステートメントのカンマです。あなたが使用している場合は、それがうまくいく以下:

%「『%s』の中に 『%s』を探して」印刷(文字列、ファイル名)

2

printステートメントは、各引数の間にスペースを表示します。 print statementのためのマニュアルを参照してください:出力システムは、それが行の先頭に位置していると考えている場合を除き

スペースが各オブジェクトの前に書かれているが、(変換して)書かれています。

あなたは代わりに文字列の連結を使用して試みることができる:

print "Looking for '" + s + "' in '" + filename + "'" 

またはより良いまだ、str.formatを使用しています。

print "Looking for '{0}' in '{1}'".format(s, filename) 

注:変数名にstrを使用しないでください。

4

あなたではなく1つの文字列にそれらを連結し、一度にそれを印刷するよりも、print文に別の文字列を渡しているので、それはです:文字列を連結することは比較的高価であること

>>> print "a", "b" 
a b 
>>> print "a" + "b" 
ab 

注:これは、使用することをお勧めします補間は次のようになります:

>>> print "A %s with %s" % ("string", "placeholders") 
A string with placeholders 
1

他は既にあなたのスペースに関する質問に答えています。

いくつかの他の提案:

strが()ので、それには何も割り当てていないか、あなたはそれを使用したい場合、それは動作しませんなぜあなたは後で疑問に思うかもしれ組み込み関数です。また

insensitive = "-i" in sys.argv 
1

別の提案ではなく、自分でARGVを解析するの、あなたはLinuxのスタイルオプション/フラグを処理させるOptionParserを試してみてください:

insensitive = 1 if ("-i" in sys.argv) else 0 

は同じほとんどです。

from optparse import OptionParser 
PARSER = OptionParser(usage="""usage: %%prog [-b] file_name""") 
PARSER.add_option("-b", "--boundaries", action="store_true", dest="boundaries", help="Boundaries ?") 
options, arguments = PARSER.parse_args() 
if options.boundaries: 
    # -b was activated... 
file_name = arguments[0]