3

awk/sed要件の高度なツールとして簡単なスクリプトを作成しました。スクリプトでは、クエリ ファイルの 1 つの列の値に基づいて 2 つのファイルを比較し、マスター ファイルからエントリ全体を抽出します。このスクリプトを使用すると、各ファイルの列と区切り記号の値を入力できます。

問題は、コマンド ラインから指定された場合、'delimiter' オプションがスクリプトによって認識されないことです。

これが私のコードです(部分的):

##- - - - - - - -- - - - - - Arguments - - - - - - - - - - - - - -##
parser = argparse.ArgumentParser()

## Command line options
parser.add_argument("-m",  "--master",     dest="master", help="master file")
parser.add_argument("-q",  "--query",      dest="query",  help="queries to be extracted")
parser.add_argument("-d",  "--delimiter",  dest="delimiter",  default='\t', help="delimiter in master")
parser.add_argument("-p",  "--position",   dest="position",   default='1',  help="position/column of value in master")
parser.add_argument("-d2", "--delimiter2", dest="delimiter2", default='\t', help="delimiter in query")
parser.add_argument("-p2", "--position2",  dest="position2",  default='1',  help="position/column of value in query")

args = parser.parse_args()

def Extractor(master, query):

    out_file = ('%s_matched_%s' % (query,master))
    fh_out = open(out_file, 'w')

    query_set = () ## To unique query set
    for i in query:
        key = i.split('args.delimiter2')[int(args.position2)] ## Key is the value on which matching will be done
        query_set.add(key)

ご覧のとおり、コマンドラインから「クエリファイル」区切り文字のオプションを取得し、スクリプトで使用しますargparseが、それは機能しません。次のように、スクリプトで区切り記号を明示的に言及した場合にのみ機能します。

key = i.split('\t')[args.position2] ## Key is the value on which matching will be done

私が与えるコマンドラインオプションは次のとおりです。

$ py3 ExtractHeaders_v01.py -m ABC.csv -q XYZ.list -d2 \t -d , -p 1 -p2 0

どこ

  • ABC.csvエントリを抽出するマスター ファイルです。
    • 2 番目の列は照合に使用されます ( -p 1)
    • 区切り文字はカンマ ( -d ,)
  • XYZ.listクエリファイルです。
    • 最初の列はマッチングに使用されます ( -p2 0)
    • 区切り文字はタブ ( -d2 \t)

コマンドラインから指定されたときにスクリプトで区切り文字が使用されない理由を理解してください。

4

2 に答える 2

2

シェルは\tコマンド ラインで を解釈しており、Python に渡されるのはおそらく単一のt. \\tまたはを試して'\t'、リテラルの 2 文字のエスケープ シーケンスをargv. 次に、Python でこの文字列をエスケープ解除する必要があります。

delimiter = delimiter.decode("string-escape") 
于 2012-09-08T22:34:34.623 に答える
1

Tab*nix シェル (bash など) で文字をCtrl+V渡すこともできTabます" Ctrl+V Tab "

于 2012-09-08T22:38:48.597 に答える