Найти - Пользователи
Полная версия: Цикл for отрабатывает только один раз. Нужна помощь
Начало » Python для новичков » Цикл for отрабатывает только один раз. Нужна помощь
1 2 3
Gang
Я нуб в Питоне, поэтому не судите строго. Вот код моего скрипта

import re
fKeys = open('keys.txt','r')
fCity = open('city.txt','r')
fResult = open('result.txt','w')
for lineKeys in fKeys:
    lineKeys = re.sub('\n', '', lineKeys)
    for lineCity in fCity:
        lineCity = re.sub('\n', '', lineCity)
        result = lineKeys+' '+lineCity
        fResult.write(result + '\n')
fKeys.close()
fCity.close()
fResult.close()

содержимое файла keys.txt
футболки для беременных
одежда для беременных
вещи для беременных

содержимое файла city.txt
Москва
Рязань
Питер

В результате в файле result.txt получаеться
футболки для беременных Москва
футболки для беременных Рязань
футболки для беременных Питер

То есть первый цикл берет только первую строку ‘футболки для беременных’ и все, второй вложеный цикл отрабатывает нормально.

Но мне нужно чтоб результат работы был следующий
футболки для беременных Москва
футболки для беременных Рязань
футболки для беременных Питер
одежда для беременных Москва
одежда для беременных Рязань
одежда для беременных Питер
вещи для беременных Москва
вещи для беременных Рязань
вещи для беременных Питер

Помогите решить проблему. Почему первый цикл for берет только первую строку из файла?
Kixiro
Самое простое решение - перенести одну строчку

import re
fKeys = open('keys.txt','r')
fResult = open('result.txt','w')
for lineKeys in fKeys:
    lineKeys = re.sub('\n', '', lineKeys)
    fCity = open('city.txt','r')
    for lineCity in fCity:
        lineCity = re.sub('\n', '', lineCity)
        result = lineKeys+' '+lineCity
        fResult.write(result + '\n')
fKeys.close()
fCity.close()
fResult.close()
FishHook
Gang
Почему первый цикл for берет только первую строку из файла?
Потому что во вложенном цикле вы достигли конца файла на первой же иттерации внешнего цикла, больше из него ничего не читается
Gang
Спасибо! Работает. А я то думал, что он во вложеном цикле как все отработает, тогда идет на верх во внешний, и берет новую строку.
py.user.next
Gang
Помогите решить проблему.
Перед внутренним циклом выполни fCity.seek(0) (переставит указатель в начало файла).

Gang
fKeys.close()
fCity.close()
fResult.close()
И сделай with, не надо мучать close'ы.

Kixiro
Самое простое решение - перенести одну строчку
Не, оно открывает файл и потом бросает его при каждом внешнем витке. Нужно seek() использовать.
FishHook
Gang
Спасибо! Работает. А я то думал, что он во вложеном цикле как все отработает, тогда идет на верх во внешний, и берет новую строку.
Так всё и происходит, но запись итогов в файл у вас делается во внутреннем цикле, внутренний цикл отрабатывает только один раз - самый первый, после этого первого раза читать из файла больше нечего, поэтому в итоговый файл файл ничего не пишется, несмотря на то, что по внешнему циклу проходы продолжаются.

смотри
k = 10
for i in range(100):
    for j in range(k):
        # первый раз, когда i=1 в консоль выводится десять значений 
        print(j)
    k = 0 
    # Всё, больше внутренний цикл выполняться не будет, он пустой
Gang
И сделай with, не надо мучать close'ы.
А это как? Что оно даст? Можете показать на примере, в контексте моего скрипта?
py.user.next
f1 = open('fname1')
f2 = open('fname2')
f3 = open('fname3')
 
with f1, f2, f3:
    f1.read()
    f2.read()
    f3.read()

Gang
А это как? Что оно даст?
Оно правильно закрывает файлы при любых условиях.

Gang
lineKeys = re.sub('\n', '', lineKeys)
line = line.rstrip('\n')
Gang
py.user.next
Спасибо!
Gang
Сделал так
fKeys = open('keys.txt','r')
fCity = open('city.txt','r')
fResult = open('result.txt','w')
for lineKeys in fKeys:
    lineKeys = lineKeys.rstrip('\n')
    fCity.seek(0)
    for lineCity in fCity:
        lineCity = lineCity.rstrip('\n')
        result = lineKeys+' '+lineCity
        fResult.write(result + '\n')
with fKeys, fCity, fResult:
    fKeys.read()
    fCity.read()
    fResult.read()
Все пашет. Но смущает постоянно порявляющаяся ошибка.
C:\Python34\python.exe "D:/Учимся Программировать/programing_pracktik/python/3/main.py"
Traceback (most recent call last):
  File "D:/Учимся Программировать/programing_pracktik/python/3/main.py", line 16, in <module>
    fResult.read()
io.UnsupportedOperation: not readable
Process finished with exit code 1
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB