0

这类似于我之前提出的问题。但我决定让它更复杂一点。

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

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

* 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 行,它也会打印出最后两条错误消息。我不明白为什么。我做错了什么。

请帮忙。

4

2 回答 2

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 linecan 被解释为,因为在布尔上下文'VERSION_2_' in line中考虑任何非空字符串,因此返回就像运算符返回第二个字符串一样,然后针对运算符进行测试:True'VERSION_3_' and 'VERSION_2_''VERSION_2_'andin

>>> bool('VERSION_3_' and 'VERSION_2_')
True
>>> 'VERSION_3_' and 'VERSION_2_'
'VERSION_2_'

我确实怀疑即使使用这些修复程序,您的代码也无法正常工作;您一次测试一行,并且您的输入示例在单独的行VERSION_中包含字符串。

于 2013-04-11T17:45:41.620 回答
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"

如果任一版本有多个查找,这将返回最后一个。如果每个只有一个无关紧要,但如果您需要第一个,或者如果您有多个相同版本的查找结果想要返回错误,则必须稍微更改它。

于 2013-04-11T21:33:14.703 回答