<p>您可以使用<code>csv</code>模块来处理文件/字符串。</p>
<p>只需读取所有值并逐行循环,根据需要进行调整。然后使用<code>csv.writer</code>对象将它们写回新文件。</p>
<pre><code>import csv
import shutil
import os
with open('potatoes.txt') as f, open('newpotatoes.txt', 'w') as fout:
rdr = csv.reader(f)
wrt = csv.writer(fout)
for line in rdr:
if line[0] in ('Town 2', 'Town 4'):
line[1] = str(int(line[1]) - 20)
wrt.writerow(line)
shutil.copyfile('newpotatoes.txt', 'potatoes.txt')
os.remove('newpotatoes.txt')
</code></pre>
<p>线路</p>
<pre><code>line[1] = str(int(line[1]) - 20)
</code></pre>
<p>可能有点乱。这是因为csv中的值都是字符串。所以这是一个简单的方法,把它转换成一个整数,减去20,再转换回一个字符串。</p>
<p>看看你的代码,里面有一个初学者经常犯的错误。</p>
<pre><code>if "Town 2" or "Town 4" in line:
</code></pre>
<p>你必须意识到这是两个独立语句的组合,而不是你所期望的。第一个语句是<code>Town 2</code>,它的计算结果总是<code>True</code>。第二个语句是<code>"Town 4" in line"</code>,如果字符串“Town 4”包含在<code>line</code>字符串中的任何位置,则返回True。</p>
<p>毫无疑问,您的意图是测试字符串是否在<code>line</code>中。为此,需要显式测试两个字符串。</p>
<pre><code>if "Town 2" in line or "Town 4" in line:
</code></pre>
<p>将按预期工作。不过,你可以更进一步,去掉声明中的一些不雅之处。</p>
<p>你知道字符串应该总是出现在字符串的第一个元素中,在<code>split</code>之后,这就是代码中的<code>info[0]</code>(或者在我让<code>csv</code>进行拆分时,<code>line[0]</code>在我的代码中)。</p>
<p>因此你可以写</p>
<pre><code>if line[0] in ('Town 2', 'Town 4'):
</code></pre>
<p>我认为你会同意这一点,即阅读更容易,打字重复更少,特别是如果你继续增加更多的城镇。</p>