这与我提出的上一个问题类似。但我决定让它更复杂一点。
我正在编写一个程序,可以读取文本文件并将文本文件的特定部分复制到另一个文本文件中。但是,我也想生成错误消息。
例如,我的文本文件如下所示:
* 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行,它也会打印出最后两个错误消息。我不明白为什么。有些事情我做错了。
请帮忙。
答案 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"
如果其中任何一个版本有多个查找,则返回最后一个版本。如果每个中只有一个无关紧要,但如果您需要第一个,或者如果您对同一版本有多个查找,则想要返回错误,则必须稍微更改一下。