Функция Python ZIP, удаляющая слишком много элементов из файла - PullRequest
0 голосов
/ 05 декабря 2018

Я читаю содержимое из текстового файла и сохраняю его в списке (каждая строка в виде отдельного элемента) (приз-список).Я делаю то же самое для winnerList, который является другим списком.

Я использую функцию zip для вызова функции emailUser каждый раз, когда и победитель, и электронная почта существуют в одном индексе.Цикл остановится, если хотя бы один элемент не существует по этому индексу.

После вызова функции удалите этот приз из списка, удалите все содержимое из файла, а затем запишите содержимое списка обратно в текстовый файл (по сути, удалив этот один элемент).

Проблема заключается в том, что строка prizeList.remove(prize) или writeTo.write(prizes) удаляет слишком много содержимого из текстового файла.При удалении одного элемента (из txt-файла) за итерацию в цикле он удаляет еще много.

Вот моя попытка:

   for prize, winner in zip(prizeList, emailList):


    print(f'{prize} goes to {winner}')


    emailUserWithPrize(winner, prize, prizeType)

    print("Before: ")
    print(prizeList)

    prizeList.remove(prize)

    file.close()

    writeTo = open(prizeFile, "w")

    prizes = ""
    for i in range(len(prizeList)):
        prizes = prizeList[i]

    writeTo.write(prizes)



    print("After:")
    print(prizeList)

if len(prizeList) < 1:
    print("No more prizes for " + prizeType)

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Давайте попробуем деконструировать ваш код.Вы находите совпадения в первых позициях в списке призов и в списке адресов электронной почты, верно?Затем вы удаляете каждый данный приз из списка призов.Затем, если у вас остались призы, вы добавляете их в файл с призами.

prize_list = ['p1', 'p2', 'p3', 'p4', 'p5', 'p6']
email_list = ['e1', 'e2', 'e3', 'e4']

matches = list(zip(prize_list, email_list))

for prize, winner in matches:
    print(f'{prize} goes to {winner}')
    print("Before: ", prize_list)
    print('removing', prize)
    prize_list.remove(prize)
    print('{} prizes left'.format(len(prize_list)))

prize_file = 'prizeFile.txt'
with open(prize_file, "w") as file_:
    for prize in prize_list:
        file_.write(prize)
        file_.write('\n')

Вывод:

p1 goes to e1
Before:  ['p1', 'p2', 'p3', 'p4', 'p5', 'p6']
removing p1
5 prizes left
p2 goes to e2
Before:  ['p2', 'p3', 'p4', 'p5', 'p6']
removing p2
4 prizes left
p3 goes to e3
Before:  ['p3', 'p4', 'p5', 'p6']
removing p3
3 prizes left
p4 goes to e4
Before:  ['p4', 'p5', 'p6']
removing p4
2 prizes left
After: ['p5', 'p6']
0 голосов
/ 05 декабря 2018

Кажется, вы, возможно, непреднамеренно усекаете один из своих списков (prizeList или emailList), потому что zip повторяется только до тех пор, пока не завершится один из входных списков (более общих итераторов), какзадокументировано .
Вы можете проверить это, напечатав длины каждого списка, конечно, но я предполагаю, что это источник ваших проблем.
Решение проблемы, зависит от того, чтовы на самом деле пытаетесь сделать, и я не могу угадать достаточно базы на вашем коде.
Удачи!


Обновление из-за комментария: Если вы беспокоитесь, вы неправильное чтение и / или запись текстовых файлов, это другая проблема, и ее следует проверить и отладить как отдельное усилие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...