2012-07-30 96 views
0

我有这样一个文件..查找和替换全线蟒蛇

xxxxxxxxxxxxxxx 
xxxxxxxxxxxxxxx 
xxxxxxxxxxxxxxx 
a b c invalid #seperated by tab 
xxxxxxxxxxxxxxx 
xxxxxxxxxxxxxxx 

我需要更换a b c invalida b reviewed rd # separated by tab 基本上是无效的结尾的任何行,我需要更换符合reviewed rd // separated by tab但我必须保留第一个和第二个单词(只替换第三个和第四个)。

我已经开始做这样的事情,但这不会完全按照我的意愿去做。

f1 = open('fileInput', 'r') 
f2 = open('fileInput'+".tmp", 'w') 
for line in f1: 
    f2.write(line.replace('invalid', ' reviewed'+\t+'rd')) 
f1.close() 
f2.close() 

regex可以是一个选项,但我还没有那么好。有人可以帮忙吗?

P.S. a,b和c是变量..我无法对'a','b','c'进行精确搜索。

+0

在什么方式的代码你想要什么不能做? – 2012-07-30 18:43:49

+0

它应该是'a b c审查\ trd'还是你真的是指'b审查\ trd'? – mgilson 2012-07-30 18:45:41

+0

输出将是b c审查rd ..我只想b审查rd。 c不是恒定的 – Ank 2012-07-30 18:46:04

回答

2
f1 = open('fileInput', 'r') 
f2 = open('fileInput+".tmp"', 'w') 
for line in f1: 
    if line[:-1].endswith("invalid"): 
     f2.write("\t".join(line.split("\t")[:2] + ["reviewed", "rd"]) + "\n") 
    else: 
     f2.write(line) 
f1.close() 
f2.close() 
+0

不错的做法... +1 – Ank 2012-07-30 19:06:44

1
with open('input.tab') as fin, open('output.tab', 'wb') as fout: 
    tabin = csv.reader(fin, delimiter='\t') 
    tabout = csv.writer(fout, delimiter='\t') 
    for row in tabin: 
     if len(tabin) != 4: 
      continue # or raise - whatever 
     if row[-1] == 'invalid': 
      tabout.writerow(row[:2] + ['reviewed', 'rd']) 
2
import re 

pattern = re.compile(r'\t\S+\tinvalid$') 
with open('data') as fin: 
    with open('output', 'w') as fout: 
     for line in fin: 
      fout.write(pattern.sub('\treviewd\trd', line))