Два файла. Один со сломанными данными, другой с исправлениями. Разбитая:Возобновление вложенного цикла for
ID 0
T5 rat cake
~EOR~
ID 1
T1 wrong segg
T2 wrong nacob
T4 rat tart
~EOR~
ID 3
T5 rat pudding
~EOR~
ID 4
T1 wrong sausag
T2 wrong mspa
T3 strawberry tart
~EOR~
ID 6
T5 with some rat in it
~EOR~
Исправления:
ID 1
T1 eggs
T2 bacon
~EOR~
ID 4
T1 sausage
T2 spam
T4 bereft of loif
~EOR~
ПНП означает конец записи. Обратите внимание: файл Broken имеет больше записей, чем файл исправления, в котором есть теги (T1, T2 и т. Д.) Для исправления и теги для добавления. Этот код делает именно то, что он должен делать:
# foobar.py
import codecs
source = 'foo.dat'
target = 'bar.dat'
result = 'result.dat'
with codecs.open(source, 'r', 'utf-8_sig') as s, \
codecs.open(target, 'r', 'utf-8_sig') as t, \
codecs.open(result, 'w', 'utf-8_sig') as u:
sID = ST1 = sT2 = sT4 = ''
RecordFound = False
# get source data, record by record
for sline in s:
if sline.startswith('ID '):
sID = sline
if sline.startswith('T1 '):
sT1 = sline
if sline.startswith('T2 '):
sT2 = sline
if sline.startswith('T4 '):
sT4 = sline
if sline.startswith('~EOR~'):
for tline in t:
# copy target file lines, replacing when necesary
if tline == sID:
RecordFound = True
if tline.startswith('T1 ') and RecordFound:
tline = sT1
if tline.startswith('T2 ') and RecordFound:
tline = sT2
if tline.startswith('~EOR~') and RecordFound:
if sT4:
tline = sT4 + tline
RecordFound = False
u.write(tline)
break
u.write(tline)
for tline in t:
u.write(tline)
Я пишу в новый файл, потому что я не хочу испортить другие два. Первый внешний для цикла заканчивается на последней записи в файле исправлений. В этот момент в целевом файле есть записи для записи. Вот что делает последнее предложение for-clause.
Что мне нюхало, что эта последняя строка неявно берет начало, когда первый внутренний цикл был выбит. Это как если бы он должен сказать `для остальной части tline в t '. С другой стороны, я не вижу, как это сделать с меньшим количеством (или не намного больше) строк кода (используя dicts и что у вас есть). Должен ли я беспокоиться?
Прокомментируйте, пожалуйста.
Я бы создал счетчик «tPosition», который вы увеличиваете каждый раз, когда вы двигаетесь по соответствующему циклу. Затем, когда вы хотите сказать «для остальной части tline in t», вы можете указать, что хотите перебрать что-то вроде: для tline in t [tPosition:] – duhaime