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,你想显示1它,这清楚地表明,你只对8th bit 感兴趣。唯一看起来很奇怪的情况是您的 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

你可以这样做:

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 回答
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 回答