9

いくつかの入力行のフィールドを解析するPythonプログラムを作成しています。コマンドラインからオプションとしてフィールドセパレータを入力できるようにしたいと思います。私はこれを行うために使用optparseしています。私は、のようなものを入力すると、タブではなく、で\t文字通り分離するという問題に直面しています。これは私が望むものです。\t考えられる引用符、円記号、およびのすべての組み合わせを試したので、これはPythonのものであり、シェルではないと確信していtます。

optparse引数を、ではなく単純な入力(そのようなものはありますか?)にすることができればraw_input、それはうまくいくと思います。しかし、私にはそれを行う方法がわかりません。

また、文字列を2文字から1文字のタブに変換するために、さまざまな置換と正規表現のトリックを試しました"\t"が、成功しませんでした。

例、ここinput.txtで:

field 1[tab]field\t2

(注:[tab]はタブ文字でfield\t2あり、8文字の文字列です)

parseme.py:

#!/usr/bin/python
from optparse import OptionParser  
parser = OptionParser()  
parser.add_option("-d", "--delimiter", action="store", type="string",  
    dest="delimiter", default='\t')  
parser.add_option("-f", dest="filename")  
(options, args) = parser.parse_args()  
Infile = open(options.filename, 'r')  
Line = Infile.readline()  

Fields = Line.split(options.delimiter)  
print Fields[0]  
print options.delimiter  

Infile.close()  

これは私に与えます:

$ parseme.py -f input.txt  
field 1  
[tab]

ねえ、素晴らしい、デフォルト設定は正しく機能しました。(はい、私は\ tをデフォルトにしてそれを忘れることができることを知っていますが、このタイプの問題に対処する方法を知りたいです。)

$ parseme.py -f input.txt -d '\t'  
field 1[tab]field  
\t

これは私が望むものではありません。

4

4 に答える 4

7
>>> r'\t\n\v\r'.decode('string-escape')
'\t\n\x0b\r'
于 2011-04-22T08:13:25.657 に答える
0

迅速で汚い方法はeval、次のようにそれを行うことです。

eval(options.delimiter, {}. {})

余分な空のdictは、プログラムの偶発的な破壊を防ぐためにあります。

于 2011-04-22T07:48:00.687 に答える
0

callbackオプションは、トリッキーなケースを処理するための良い方法です:

parser.add_option("-d", "--delimiter", action="callback", type="string",
                  callback=my_callback, default='\t')

対応する関数を使用して(パーサーの前に定義する必要があります):

def my_callback(option, opt, value, parser):
    val = value
    if value == '\\t':
        val = '\t'
    elif value == '\\n':
        val = '\n'
    parser.values.delimiter = val

コマンドラインでこれが機能することを確認できますpython test.py -f test.txt -d \t:\t

解析結果の後処理ではなく、「optparse」モジュールを介してオプションを処理するという利点があります。

于 2011-04-22T08:43:24.553 に答える
0

スクリプト内から解決します。

options.delimiter = re.sub("\\\\t","\t",options.delimiter)

より多くのエスケープ文字 (\n、\r など) に一致するように re を適応させることができます。

Python以外で問題を解決する別の方法:

シェルからスクリプトを呼び出すときは、次のようにします。

parseme.py -f input.txt -d '^V<tab>'

^V は「Ctrl+V を押す」という意味です。

次に、通常のタブキーを押します

これにより、タブ文字が Python スクリプトに適切に渡されます。

于 2011-04-22T08:11:30.540 に答える