Извините за глупый вопрос новичка, но мои вложенные циклы не работают. Возвращает только первую итерацию. Что я пропустил ??
Я пытаюсь найти несколько строк в основном файле с помощью grep. Я думаю, что испортил отступ, но все варианты, которые я пробую, возвращают ошибки.
f = open('GRCh37_genes_all_mod.txt', 'rU') # main search file
f1 = open('genes_regions_out.txt', 'a') #out file
f2 = open('gene_list.txt', 'r') # search list
for gene in f2:
for line in f:
if gene in line:
print line
f1.write(line)
@meowgoesthedog: О да. :) Спасибо за ссылку






Вы можете перебирать файл только один раз. После первого использования f при следующей попытке запустить for line in f вы не получите никакого контента.
Если вы хотите перебрать содержимое файла несколько раз, вы можете поместить это содержимое в список.
with open('GRCh37_genes_all_mod.txt', 'rU') as f:
contents = list(f)
with open('gene_list.txt', 'r') as f:
genes = list(f)
for gene in genes:
for line in contents:
...
@brunodesthuilliers Не стесняйтесь публиковать альтернативные ответы.
Спасибо всем. Теперь у меня есть рабочие петли. Я протестировал ответ @khelwood, и это решило мою проблему.
Хотя чтение всего в память работает, это также можно сделать, просто перемотав файл, что потребовало бы намного меньше памяти.
После первой итерации указатель файла находится в конце файла, и итератор исчерпан (вызовы next(f) будут вызывать StopIteration).
Самое простое решение в этом случае - сбросить указатель файла с помощью f.seek(0):
for gene in f2:
f.seek(0)
for line in f:
# ...
Для других итераций (которые могут не быть «сбрасываемыми»), если вы знаете, сколько «копий» вам нужно, вы можете использовать itertools.tee(), или, если вы знаете, что итерабельность конечна (некоторые итерируемые бесконечны), и все его содержимое подойдет в памяти вы можете просто составить список, как объяснил Хелвуд.
Оба ответа исправляют мою первоначальную ошибку. Спасибо. Но у обоих теперь есть добавленный результат сброса несоответствий в выходы после того, как я дал мне правильные.
Сначала вы должны пройти по строкам индивидуально, используя
for gene in f2.readlines():и то же самое дляf.