0

私のデータ:

1 255 59 0 1 255 0 1 1 0 4 0 5 

0 1 255 1 253 0 90 1 1 0 2 0 233

私はPythonが初めてで、テキストファイルのすべての値を使用条件で置き換える必要があります:

  1. 行の値 = 255 の場合、1 に置き換えます

  2. 行の値が < 255 (254、253、252...) の場合、0 に置き換えます

したがって、私のターゲットデータは次のとおりです。

1 1 0 0 1 1 0 1 1 0 0 0 0 

0 1 1 1 0 0 0 1 1 0 0 0 0

どうすればこの問題を解決できますか?

実際、修正しようとしましたが、自分のデータでは機能しません。

これは私のコードです:

f1 = open('20130103.txt','r')
f2 = open('20130103_2.txt','w')
count = 255
for line in f1:
    line = line.replace('255','1')
    count = count-1
    line = line.replace('%d'%(count), '0')
    f2.write(line)
f1.close()
f2.close()

結果は次のとおりです。

1 1 59 0 1 1 0 1 1 0 4 0 5 
0 1 1 1 0 0 90 1 1 0 2 0 233
4

3 に答える 3

2

ここで目を引くのは、255表示したい数字 です。これは、 t1のみに関心があることを明確に示しています。8th bi奇妙に見える唯一のケースは、o/p が要件に準拠していない1ことです。その場合は操作しません。変換から除外する必要があります。

私があなたの要求を信頼しなければならないなら

>>> with open("test.in") as fin, open("test.out","w") as fout:
    for line in fin:
        line = (e >> 7 for e in map(int, line.split()))
        fout.write(''.join(map(str, line)))
        fout.write('\n')

あなたのデータを信頼する必要がある場合

>>> with open("test.in") as fin, open("test.out","w") as fout:
    for line in fin:
        line = (e >> 7 if e != 1  else 1 for e in map(int, line.split()))
        fout.write(''.join(map(str, line)))
        fout.write('\n')

この問題に対する別の見方。

>>> with open("test.in") as fin, open("test.out","w") as fout:
    for line in fin:
        line = (e / 255 if e != 1  else 1 for e in map(int, line.split()))
        fout.write(''.join(map(str, line)))
        fout.write('\n')
于 2013-01-20T16:42:14.757 に答える
1

置換文字列の代わりに関数を渡す方法の例を次に示します。これre.subにより、置換がどのように行われるかを非常に細かく制御できます。

import re
lines = ['1 255 59 0 1 255 0 1 1 0 4 0 5',
     '0 1 255 1 253 0 90 1 1 0 2 0 233']
def do_replace(match):
    number = int(match.group(0))
    if number == 0 or number == 1:
        return str(number)
    elif number == 255:
        return '1'
    elif number < 255:
        return '0'
    else:
        raise ValueError
for line in lines:
    print re.sub(r'\d+', do_replace, line)

プリント:

1 1 0 0 1 1 0 1 1 0 0 0 0
0 1 1 1 0 0 0 1 1 0 0 0 0
于 2013-01-20T16:26:02.327 に答える
1

次のようなことができます。

with open('20130103.txt', 'r') as f1, open('20130103_2.txt', 'w') as f2:
    for line in f1:
        values = line.split()
        new_values = ' '.join('1' if value == '255' else '0' for value in values)

        f2.write(new_values + '\n')
  • line.split()行をチャンクに分割します。'a b'.split() == ['a', 'b']
  • '1' if value == '255' else '0' for value in values値のリスト内の項目の値に応じて、'1'またはを出力するジェネレータです。'0'
  • ' '.join()リスト (この場合はジェネレーター) 内の値をスペースで結合します。
于 2013-01-20T16:12:56.297 に答える