<p>我不会担心的。在您的示例中,<code>t</code>是一个文件句柄,您正在对其进行迭代。Python中的文件句柄是它们自己的迭代器;它们具有关于在文件中读取位置的状态信息,并且在您对它们进行迭代时将保留它们的位置。您可以查看python文档中的<a href="http://docs.python.org/2/library/stdtypes.html#file.next" rel="nofollow noreferrer">file.next()</a>以获取更多信息。你知道吗</p>
<p>另请参阅另一个同样讨论迭代器的SO答案:<a href="https://stackoverflow.com/questions/231767/the-python-yield-keyword-explained/231855#231855">What does the "yield" keyword do in Python?</a>。有很多有用的信息!你知道吗</p>
<p><strong>编辑:</strong>这里有另一种使用字典组合它们的方法。如果要在输出之前对记录进行其他修改,则需要使用此方法:</p>
<pre><code>import sys
def get_records(source_lines):
records = {}
current_id = None
for line in source_lines:
if line.startswith('~EOR~'):
continue
# Split the line up on the first space
tag, val = [l.rstrip() for l in line.split(' ', 1)]
if tag == 'ID':
current_id = val
records[current_id] = {}
else:
records[current_id][tag] = val
return records
if __name__ == "__main__":
with open(sys.argv[1]) as f:
broken = get_records(f)
with open(sys.argv[2]) as f:
fixed = get_records(f)
# Merge the broken and fixed records
repaired = broken
for id in fixed.keys():
repaired[id] = dict(broken[id].items() + fixed[id].items())
with open(sys.argv[3], 'w') as f:
for id, tags in sorted(repaired.items()):
f.write('ID {}\n'.format(id))
for tag, val in sorted(tags.items()):
f.write('{} {}\n'.format(tag, val))
f.write('~EOR~\n')
</code></pre>
<p><code>dict(broken[id].items() + fixed[id].items())</code>部分利用了这一点:
<a href="https://stackoverflow.com/questions/38987/how-can-i-merge-union-two-python-dictionaries-in-a-single-expression">How to merge two Python dictionaries in a single expression?</a></p>