0

特定のテキスト ファイルを解析しようとしています。私はテキストファイルを開こうとしており、特定の文字列がそこにあるかどうかを1行ずつ尋ねています(次の例では、中括弧内に数字01が存在します)。次に、特定の文字列を前方に後方に操作するか、保持します同じ。これがその例です。任意に「go」という名前の1行があります...(完全なファイルの他の行は同様の形式ですが、{01}, {00}etc...

go = 'USC_45774-1111-0     <hkxhk> {10} ; 78'

go = go.replace(go[22:24],go[23:21:-1])

>>> go
'USC_45774-1111-0     <khxkh> {10} ; 78'

"hk" (go[22:24])最初の文字を同じ文字に置き換えて、逆に操作しようとして(go[23:21:-1)khxhkますkhxkh

また、各行に対して特定の if ステートメントを実行する際にも問題があります。持っていない多くの行が{01}、あたかもそうであるかのように操作されています....

with open('c:/LG 1A.txt', 'r') as rfp:
with open('C:/output5.txt', 'w') as wfp:
    for line in rfp.readlines():
        if "{01}" or "{-1}" in line:
            line = line.replace(line[25:27],line[26:24:-1])   
            line = line.replace("<"," ")
            line = line.replace(">"," ")
            line = line.replace("x","   ")
            wfp.write(line)

        elif "{10}" or "{1-}" in line:
            line = line.replace(line[22:24],line[23:21:-1])   
            line = line.replace("<"," ")
            line = line.replace(">"," ")
            line = line.replace("x","   ")
            wfp.write(line)

        elif "{11}" in line:
            line = line.replace(line[22:27],line[26:21:-1])   
            line = line.replace("<"," ")
            line = line.replace(">"," ")
            line = line.replace("x","   ")
            wfp.write(line)

    wfp.close()

簡単なものがありませんか?

4

3 に答える 3

1

文字列replaceメソッドは、文字を位置で置き換えるのではなく、文字が何であるかで置き換えます。

>>> 'apple aardvark'.replace('a', '!')
'!pple !!rdv!rk'

したがって、最初のケースでは、「hk」を「kh」に置き換えるように指示しています。オカレンスの 1 つだけを置き換えたいことを「認識」していません。「hk」を「kh」に置き換えたいことを知っているだけなので、すべての出現箇所を置き換えます。

count引数 to replace を使用して、最初に出現したもののみを置換することを指定できます。

>>> go = 'USC_45774-1111-0     <hkxhk> {10} ; 78'
... go.replace(go[22:24],go[23:21:-1],1)
'USC_45774-1111-0     <khxhk> {10} ; 78'

ただし、これは常に最初の出現を置換することに注意してください。必ずしも指定した文字列内の位置で出現するとは限りません。この場合、それはあなたが望むものだと思いますが、他の同様のタスクでは直接機能しない場合があります。(つまり、このメソッドをそのまま使用して 2 番目または 3 番目のオカレンスを置き換える方法はありません。最初のオカレンス、または最初の 2 つ、または最初の 3 つなどを置き換えることしかできません。2 番目または 3 番目のオカレンスを置き換えるには発生する場合は、もう少し行う必要があります。)

質問の 2 番目の部分については、意味を誤解していif "{01}" or "{-1}" in lineます。これは、平たく言えば、if "{01}" or if "{-1}" in line. は常に true であるためif "{01}"(つまり、文字列 "{01}" は false 値ではありません)、条件全体は常に true です。あなたが欲しいのはですif "{01}" in line or "{-1}" in line"

于 2012-08-30T04:46:49.333 に答える
0

Python についてはわかりませんが、あなたの問題は、毎日少なくとも数回ここに投稿される問題です。

if "{01}" or "{-1}" in line:

これはあなたが思っていることをしません。"{01}"「本当ですか?」と尋ねます。長さがゼロでない文字列なので、そうです。or短絡のため、最初の引数が真であるため、残りの条件はテストされません。したがって、ifステートメントの本文は常に実行されます。

つまり、Python は次のように記述したかのように評価します。

if ("{01}") or ("{-1}" in line):

次のようなものが必要です。

if "{01}" in line or "{-1}" in line:

または、似たような条件がたくさんある場合:

if any(x in line for x in ("{01}", "{-1}")):
于 2012-08-30T04:44:55.547 に答える
0

次のカウント引数を使用できますreplace()

'USC_45774-1111-0     <hkxhk> {10} ; 78'.replace("hk","kh",1)

2 番目の質問では、条件を次のように変更する必要があります。

if "{01}" in line or "{-1}" in line:
    ...
于 2012-08-30T04:45:28.483 に答える