<p>您可以将<code>InvNo</code>和<code>URL</code>最初设置为<code>None</code>,并且仅当<code>InvNo</code>和<code>URL</code>都不存在错误时才打印记录:</p>
<pre><code>impfile = filename[:4]
with open(filename + '_earmark.dat', 'w') as media, open(impfile, 'r') as f:
InvNo = URL = None
for line in f:
if line.startswith('InvNo: '):
InvNo = line[line.find('InvNo: ')+7:len(line)]
if line.startswith('Media: '):
mediaref = line[7:len(line)-1]
URL = getURL(mediaref)
if line.startswith('~EOR~'):
if InvNo and URL:
recordbuf = 'IN {}\nUR {}\n**\n'.format(InvNo, URL)
media.write(recordbuf)
InvNo = URL = None
</code></pre>
<hr/>
<p>注意:我将<code>'InvNo: ' in line</code>改为<code>line.startswith('InvNo: ')</code>,基于<code>InvNo</code>总是出现在行的开头的假设。在您的示例中似乎是这样,但是使用<code>line.find('InvNo: ')</code>的事实表明<code>'InvNo:'</code>可能出现在行中的任何位置。你知道吗</p>
<p>如果<code>InvNo:</code>仅出现在行的开头,则使用<code>line.startswith(...)</code>并删除<code>line.find('InvNo: ')</code>(因为它将等于0)。你知道吗</p>
<p>否则,您将不得不保留<code>'InvNo:' in line</code>和<code>line.find</code>(当然,<code>Media</code>和<code>~EOR~</code>也是如此)。
使用像<code>'Media' in line</code>这样的代码的问题是,如果<code>Tags</code>可以包含任何内容,那么它可能包含字符串<code>'Media'</code>,而不是真正的字段头。你知道吗</p>