Предполагая, что у вас есть функция, которая, глядя на строку, может сказать вам, является ли эта строка "желаемой", правильная структура вашего кода будет очень простой:
with open('completedataset.txt', 'r') as completedataset:
with open('smallerdataset.txt', 'w') as smallerdataset:
for line in completedataset:
if iwantthisone(line):
smallerdataset.write(line)
The with
заявления заботятся о закрытии для вас.В Python 2.7 вы можете объединить два with
в один;в Python 2.5 вам нужно запустить свой модуль с from __future__ import with_statement
;в Python 2.6, в настоящее время наиболее распространенной версии, приведенный выше код является правильной формой.
Итак, абсолютно все сводится к этой iwantthisone
функции.Вы ничего не говорите нам о формате ваших строк, что делает невозможным дальнейшую помощь.Но предположим, например, что первое слово в каждой строке идентифицирует тест, например, test432 ...
, и у вас есть номера тестов, которые вы хотите в наборе с именем want_these
, например, set([113, 432, 251, ...])
.Тогда очень простой способ написать iwantthisone
может быть следующим:
def iwantthisone(line):
firstword = line.split(None, 1)[0]
testnumber = int(firstword[4:])
return testnumber in want_these
Надлежащее содержимое iwantthisone
полностью зависит от формата ваших строк и от того, как вы скажете, какие строки на самом деле делают хочу оставить, конечно.Но я надеюсь, что эта общая структура все еще помогает.
Обратите внимание, что в этой общей структуре я не рекомендую использовать вложенные циклы! -)