Сбой вложенного цикла в Python

Извините за глупый вопрос новичка, но мои вложенные циклы не работают. Возвращает только первую итерацию. Что я пропустил ??

Я пытаюсь найти несколько строк в основном файле с помощью 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)

Сначала вы должны пройти по строкам индивидуально, используя for gene in f2.readlines(): и то же самое для f.

Sheldore 10.01.2019 15:02

@meowgoesthedog: О да. :) Спасибо за ссылку

Sheldore 10.01.2019 15:05
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
2
102
2

Ответы 2

Вы можете перебирать файл только один раз. После первого использования 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 10.01.2019 15:07

Спасибо всем. Теперь у меня есть рабочие петли. Я протестировал ответ @khelwood, и это решило мою проблему.

pigeon1 10.01.2019 15:18

Хотя чтение всего в память работает, это также можно сделать, просто перемотав файл, что потребовало бы намного меньше памяти.

martineau 10.01.2019 15:45

После первой итерации указатель файла находится в конце файла, и итератор исчерпан (вызовы next(f) будут вызывать StopIteration).

Самое простое решение в этом случае - сбросить указатель файла с помощью f.seek(0):

for gene in f2:
    f.seek(0)
    for line in f: 
       # ...

Для других итераций (которые могут не быть «сбрасываемыми»), если вы знаете, сколько «копий» вам нужно, вы можете использовать itertools.tee(), или, если вы знаете, что итерабельность конечна (некоторые итерируемые бесконечны), и все его содержимое подойдет в памяти вы можете просто составить список, как объяснил Хелвуд.

Оба ответа исправляют мою первоначальную ошибку. Спасибо. Но у обоих теперь есть добавленный результат сброса несоответствий в выходы после того, как я дал мне правильные.

pigeon1 10.01.2019 15:43

Другие вопросы по теме