2013-01-20 50 views
0

我的數據:如何搜索和替換python中的多個文本文件的值?

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 

我是新來的蟒蛇,我需要通過 使用條件替換文本文件中的所有值:

  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 

我怎樣才能解決這個問題?

其實,我試圖解決它,但不適用於我的數據。

這是我的代碼:

​​

而且結果是:

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 
+0

您的條件與目標數據不一致。這些條件與數據一致: 1.如果line = 1中的值,則保留該值; 2.如果line = 255中的值,替換爲1; 3.如果行<255(254,253,252 ...)中的值替換爲0 –

+0

對不起,條件(2)中必須爲==><(小於) – Jinxsica

+0

您仍然缺少條件「如果在行= 1的值,保留值「 –

回答

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()將列表中的值(或本例中的生成器)與空格連接在一起。
+0

看來OP希望1由於某種原因被單獨留下,至少如果我們相信目標數據.. – DSM

+0

非常感謝,我試圖修復它三天。 – Jinxsica

+0

你有兩次'打開爲f1',你可能想要將後者改爲'f2':P – 2013-01-20 16:52:00

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 
+0

感謝您的幫助。現在它非常幫助我! – Jinxsica

2

這裏的眼睛捕捉器是數字255,你想要顯示1,這清楚地表明,你只對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') 
相關問題