<pre><code># building initial storage
content = {}
record = {}
order = []
current = None
with open('broken.file', 'r') as f:
for line in f:
items = line.split(' ', 1)
try:
key, value = items
except:
key, = items
value = None
if key == 'ID':
current = value
order.append(current)
content[current] = record = {}
elif key == '~EOR~':
current = None
record = {}
else:
record[key] = value
# patching
with open('patches.file', 'r') as f:
for line in f:
items = line.split(' ', 1)
try:
key, value = items
except:
key, = items
value = None
if key == 'ID':
current = value
record = content[current] # updates existing records only!
# if there is no such id -> raises
# alternatively you may check and add them to the end of list
# if current in content:
# record = content[current]
# else:
# order.append(current)
# content[current] = record = {}
elif key == '~EOR~':
current = None
record = {}
else:
record[key] = value
# patched!
# write-out
with open('output.file', 'w') as f:
for current in order:
out.write('ID '+current+'\n')
record = content[current]
for key in sorted(record.keys()):
out.write(key + ' ' + (record[key] or '') + '\n')
# job's done
</code></pre>
<p>有问题吗?你知道吗</p>