Я предлагаю инкапсулировать то, что вы хотите сделать, в функцию, где важная часть подчиняется этому логике c:
либо присоединиться к new
информация к записи old
или выводит запись old
и забывает ее
, конечно, в конце l oop мы в любом случае иметь висячую old
запись для вывода
def join(inp_fname, out_fname):
'''Input file contains sorted records, when two (or more) records differ
only in the last field, we join the last fields with a space
and output only once, otherwise output the record as-is.'''
######################### Prepare for action ##########################
from csv import reader, writer
with open(inp_fname) as finp, open(out_fname, 'w') as fout:
r, w = reader(finp), writer(fout)
######################### Important Part starts here ##############
old = next(r)
for new in r:
if old[:-1] == new[:-1]:
old[-1] += ' '+new[-1]
else:
w.writerow(old)
old = new
w.writerow(old)
Чтобы проверить, что я предложил, вы можете использовать эти два фрагмента (обратите внимание, что эти записи короче, чем у вас, но это пример, и это не имеет значения, потому что мы используем только -1
для индексации наших записей).
1-й имеет «обычную» последнюю запись
open('a0.csv', 'w').write('1,1,2\n1,1,3\n1,2,0\n1,3,1\n1,3,2\n3,3,0\n')
join('a0.csv', 'a1.csv')
, в то время как 2-й имеет последнюю запись, которая должен быть присоединен к предыдущему.
open('b0.csv', 'w').write('1,1,2\n1,1,3\n1,2,0\n1,3,1\n1,3,2\n')
join('b0.csv', 'b1.csv')
Если вы запускаете фрагменты, как я это делал до публикации, в среде, в которой вы определили join
, вы должны получить то, что хотите.