2014-01-13 32 views
0

我编码一个简单的Python脚本,解析一个文本文件,正在寻找一个字符串,如果这个字符串被发现比将替换字符串与另一个字符串,如果这个搜索字符串是找不到比将追加一个字符串。Python的搜索/重新readline和如果其他

我想一定是这样的:

#!/usr/bin/python2 
import fileinput, glob, string, sys, os 
from os.path import join 

myfile="textfile.txt" 

search_string="pussy" 
replace_string1="tutti" 
replace_string2="frutti" 

replace_strings = replace_string1 + '\n' + replace_string2 

stext = str(search_string); 
rtext = str(replace_strings); 

print "finding:\n" + stext + "\n\nreplacing with:\n" + rtext + "\n\nin:\n" + myfile 

for line in fileinput.input(myfile,inplace=1): 
    lineno = 0 
    lineno = string.find(line, stext) 
if lineno >=0: 
    line = line.replace(stext, rtext) 
    sys.stdout.write(line) 
else: 
    print "append line" 

所以,如果我用这个该脚本将if语句和else跑!哪里不对?

+0

您需要使用发布一个Python的问题时,正确的压痕;你的'if lineno> = 0'测试甚至不是'fileinput.input()'循环的一部分,并且它之前的行使用3个空格而不是4个,但是后面的行* do *使用4.所有这些都会导致代码无效。 –

+0

你想用'lineno'变量做什么? 'lineno'是**总是**将变为'0',所以'lineno> = 0'总是如此。 –

+0

是否要将文本追加到文件的末尾,并且只有在未找到搜索文本时?是否应该*所有*搜索文本被替换,或仅替换第一个? –

回答

0

缩进在Python中非常重要。比较你的代码:

for line in fileinput.input(myfile,inplace=1): 
    lineno = 0 
    lineno = string.find(line, stext) 
if lineno >=0: 
    line = line.replace(stext, rtext) 
    sys.stdout.write(line) 
else: 
    print "append line" 

与此版本:

for line in fileinput.input(myfile,inplace=1): 
    lineno = 0 
    lineno = string.find(line, stext) 
    if lineno >=0: 
     line = line.replace(stext, rtext) 
     sys.stdout.write(line) 
    else: 
     print "append line" 

看到区别? 您的if在for循环结束后执行,其中lineno包含它的最后评估(显然,您的stext未包含在文件的最后一行中,这就是这个意思)。

+0

该代码仍然无法正常工作,因为它会为输入中与搜索文本不匹配的任何行添加“附加行”。缩进不是问题的原因,仅仅是一个不知道如何在SO上发布的人为因素。 –

+0

@Martijn Pieters他希望代码为输入中与搜索文本不匹配的任何行输出“append line”。 – 2014-01-13 12:42:32

+0

我不太确定。 OP写道:*如果我使用这个脚本将会运行if语句,否则!*,意味着他惊讶地发现“append line”打印完全是即使有匹配也是如此。 –

0

您不能轻易地将行追加到文件尾部fileinput.input(),因为您无法轻松检测文件何时结束而未找到匹配项。您还正在使用string.find(),这不是测试文本是否存在的最佳方法,因为当找不到文本时会返回-1,您无法正确测试该文本。

你必须重新打开追加模式的文件后,循环在fileinput.input()

import fileinput 
import sys 

myfile = "textfile.txt" 

search_string = "pussy" 
replace_string = "tutti\nfrutti" 

found = False 
for line in fileinput.input(myfile, inplace=1): 
    if search_string in line: 
     found = True 
    line = line.replace(search_string, replace_string) 
    sys.stdout.write(line) 

if not found: 
    with open(myfile, 'a') as outfh: 
     outfh.write(replace_string + '\n') 
+0

啊这很好,工作!伟大的:) – cray

+0

请注意,你似乎接受马科斯的答案是正确的,但你的评论在这里似乎暗示他对你的缩进的修正不是你想要的。 –