Я пытаюсь разобрать текстовый файл с данными, как показано ниже:
============================= condition 1 ============================ condition 2 string col 1 col2 tags ------------------------------ xx xx abc xx xx ac col4 col 1 col5 col6 col7 col8 col9 col10 col11 col12 col13 ----------------------------------------------------------------------------------------------------- 1 11 6 30 abc text -2794 682 57388 294 210 2 11 6 30 ac text -2447 680 52973 302 214 3 11 13 text -2619 -805 120956 568 255 4 11 16 text 2185 -1261 116983 548 273 5 11 17 text -3362 -1413 127136 569 278 Criterion 30 : xxxxx text3 11 : some text here ============================================================================
Ниже перечислены вещи, которые я хочу делать.
Я могу сделать третью часть, однако я борюсь с первыми двумя, так как когда я использую f.next () для проверки условия 2, это портит мой код:
with open(each_file) as f:
copy = False
i = 0
for linenum,line in enumerate(f):
if line.strip() == "============================= Condition 1 =========================== = ":
line_next = f.next()
if line_next.strip() == "condition 2 string":
print "here1"
print line.strip()
copy = True ## Start copying when both the conditions are met
elif line_next.strip() == "col4 col 1 col5 col6 col7 col8 col9 col10 col11 col12 col13": ## Stop copying at this line
if i == 0:
copy = False
else:
copy = False
i = i + 1
elif copy:
print copy
print line
Пожалуйста, помогите мне с этим.
Возможный дубликат Анализ текстовых файлов
@jedwards идея флага сработала, большое вам спасибо :)
Это должно делать то, что вы хотите:
with open(each_file) as f:
cond_1 = False
copy = False
for linenum,line in enumerate(f.readlines()):
line = line.strip()
#print("DEBUG: line is <{0}>".format(line))
if line == "============================= condition 1 =========================== = ":
print "DEBUG: condition 1"
cond_1 = True
elif cond_1 and line == "condition 2 string":
print "DEBUG: condition 2 / start copying"
copy = True ## Start copying when both the conditions are met
elif line == "col4 col 1 col5 col6 col7 col8 col9 col10 col11 col12 col13": ## Stop copying at this line
print "DEBUG: stop copying"
copy = False
if copy:
#print "DEBUG: Copying..."
print line
Думаю, вы правильно определили свою проблему (
f.next()
выскакивает, а не смотрит). Если ваш файл не слишком большой, вы можете прочитать его все в памяти (например, в виде спискаlines
) и проверитьlines[linenum+1]
. В качестве альтернативы вы можете установить флаг, когда найдете «==== Condition 1 ====», а затем на следующей итерации убедитесь, что присутствуют и флаг, и «условие 2». Я бы предпочел первый вариант для всех, кроме самых больших входных файлов, это приведет к более чистому коду, ИМХО.