Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 7, 2015 10:38:16

Gang
Зарегистрирован: 2015-08-07
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Цикл for отрабатывает только один раз. Нужна помощь

Я нуб в Питоне, поэтому не судите строго. Вот код моего скрипта

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 берет только первую строку из файла?

Офлайн

#2 Авг. 7, 2015 10:51:01

Kixiro
От:
Зарегистрирован: 2009-09-06
Сообщения: 27
Репутация: +  1  -
Профиль   Отправить e-mail  

Цикл for отрабатывает только один раз. Нужна помощь

Самое простое решение - перенести одну строчку

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()



Офлайн

#3 Авг. 7, 2015 10:54:36

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Цикл for отрабатывает только один раз. Нужна помощь

Gang
Почему первый цикл for берет только первую строку из файла?
Потому что во вложенном цикле вы достигли конца файла на первой же иттерации внешнего цикла, больше из него ничего не читается



Отредактировано FishHook (Авг. 7, 2015 10:54:55)

Офлайн

#4 Авг. 7, 2015 11:02:33

Gang
Зарегистрирован: 2015-08-07
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Цикл for отрабатывает только один раз. Нужна помощь

Спасибо! Работает. А я то думал, что он во вложеном цикле как все отработает, тогда идет на верх во внешний, и берет новую строку.

Офлайн

#5 Авг. 7, 2015 11:07:51

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9965
Репутация: +  856  -
Профиль   Отправить e-mail  

Цикл for отрабатывает только один раз. Нужна помощь

Gang
Помогите решить проблему.
Перед внутренним циклом выполни fCity.seek(0) (переставит указатель в начало файла).

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

Kixiro
Самое простое решение - перенести одну строчку
Не, оно открывает файл и потом бросает его при каждом внешнем витке. Нужно seek() использовать.



Отредактировано py.user.next (Авг. 7, 2015 11:40:42)

Офлайн

#6 Авг. 7, 2015 11:07:55

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Цикл for отрабатывает только один раз. Нужна помощь

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

смотри
k = 10
for i in range(100):
    for j in range(k):
        # первый раз, когда i=1 в консоль выводится десять значений 
        print(j)
    k = 0 
    # Всё, больше внутренний цикл выполняться не будет, он пустой



Отредактировано FishHook (Авг. 7, 2015 11:10:28)

Офлайн

#7 Авг. 7, 2015 13:10:05

Gang
Зарегистрирован: 2015-08-07
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Цикл for отрабатывает только один раз. Нужна помощь

И сделай with, не надо мучать close'ы.
А это как? Что оно даст? Можете показать на примере, в контексте моего скрипта?

Офлайн

#8 Авг. 7, 2015 14:01:06

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9965
Репутация: +  856  -
Профиль   Отправить e-mail  

Цикл for отрабатывает только один раз. Нужна помощь

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')



Отредактировано py.user.next (Авг. 7, 2015 14:02:43)

Офлайн

#9 Авг. 7, 2015 14:08:38

Gang
Зарегистрирован: 2015-08-07
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Цикл for отрабатывает только один раз. Нужна помощь

py.user.next
Спасибо!

Офлайн

#10 Авг. 7, 2015 14:26:23

Gang
Зарегистрирован: 2015-08-07
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Цикл for отрабатывает только один раз. Нужна помощь

Сделал так

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

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version