搜索特定字符串,复制到文本文件中,如果不存在,则产生错误

时间:2013-04-11 17:44:07

标签: python string copy text-files

这与我提出的上一个问题类似。但我决定让它更复杂一点。

我正在编写一个程序,可以读取文本文件并将文本文件的特定部分复制到另一个文本文件中。但是,我也想生成错误消息。

例如,我的文本文件如下所示:

* VERSION_1_1234
#* VERSION_2_1234
* VERSION_3_1234
#* VERSION_2_4321

到目前为止,我的程序会查看“VERSION_2”的行并将该行复制到另一个文本文件中。

但现在,我希望它搜索“VERSION_3”,如果它发现“VERSION_2”和“VERSION_3”,则会产生错误。

这是我到目前为止所拥有的:

with open('versions.txt', 'r') as verFile:
    for line in verFile:
        # if pound sign, skip line
        if line.startswith('#'):
            continue
        # if version_3 there, copy
        if 'VERSION_3_' in line:
            with open('newfile.txt', 'w') as wFile:
            wFile.write(line.rpartition('* ')[-1])
        # if version_2 there, copy
        if 'VERSION_2_' in line:
            with open('newfile.txt', 'w') as wFile:
            wFile.write(line.rpartition('* ')[-1])
        # if both versions there, produce error
        if ('VERSION_3_' and 'VERSION_2_') in line:
            print ('There's an error, you have both versions in your text file')
        # if no versions there, produce error
        if not ('VERSION_3_' and 'VERSION_2_') in line:
            print ('There's an error, you don't have any of these versions in your text file')

抱歉,如果它看起来有点混乱。但是,当我运行程序时,它按原样工作,但即使有一个VERSION_3行,它也会打印出最后两个错误消息。我不明白为什么。有些事情我做错了。

请帮忙。

2 个答案:

答案 0 :(得分:5)

你的逻辑存在缺陷; ('VERSION_3_' and 'VERSION_2_') in line不符合您的想法。

你想:

'VERSION_3_' in line and 'VERSION_2_' in line

代替。类似地:

not ('VERSION_3_' and 'VERSION_2_') in line

应该是:

'VERSION_3_' not in line and 'VERSION_2_' not in line

表达式('VERSION_3_' and 'VERSION_2_') in line可以解释为'VERSION_2_' in line,因为在布尔上下文中任何非空字符串都被视为True,因此'VERSION_3_' and 'VERSION_2_'仅返回{{} 1}}当'VERSION_2_'运算符返回第二个字符串,然后针对and运算符进行测试:

in

我怀疑即使使用这些修补程序,您的代码也无法正常工作;您一次测试一行,输入示例在单独的行上有>>> bool('VERSION_3_' and 'VERSION_2_') True >>> 'VERSION_3_' and 'VERSION_2_' 'VERSION_2_' 个字符串。

答案 1 :(得分:1)

忽略语法错误,因为Martijn做了一个可爱的工作澄清,你需要某种逻辑来跟踪文件中是否找到了文本。现在你要检查它们是否在同一行,这不是你想说的。

with open('versions.txt', 'r') as verFile, open('newfile.txt', 'w') as wFile:
    version2,version3 = '',''
    for line in verFile:
        # if pound sign, skip line
        if line.startswith('#'):
            continue
        # if version_2 there, store
        if 'VERSION_2_' in line:
            version2 = line
        # if version_3 there, store
        if 'VERSION_3_' in line:
            version3 = line
        # if both versions there, produce error and stop
        if version2 and version3:
            print "There's an error, you have both versions in your text file"
            break
    else:
    # write out found version
        if version2:
            wFile.write(version2.rpartition('* ')[-1])
        elif version3:
            wFile.write(version3.rpartition('* ')[-1])
        else:
            print "There's an error, you don't have any of these versions in your text     file"

如果其中任何一个版本有多个查找,则返回最后一个版本。如果每个中只有一个无关紧要,但如果您需要第一个,或者如果您对同一版本有多个查找,则想要返回错误,则必须稍微更改一下。