Python ZIP函数从文件中删除了太多项目

时间:2018-12-05 07:23:50

标签: python list zip

我正在从文本文件中读取内容,并将其存储在列表中(每行作为一个元素)(prizeList)。我对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 :(得分:0)

似乎您可能无意间将其中一个列表(prizeListemailList)截断了,因为zip仅迭代直到其中一个输入列表(更通用的迭代器)被完成as documented
您可以通过打印每个列表的长度来进行检查,但是我想这就是问题的根源。
解决问题,取决于您实际要执行的操作,而我无法根据您的代码猜测足够的信息。
祝你好运!


由于评论而更新:如果您担心无法正确地读取和/或写入文本文件,那是另一个问题,应单独检查和调试。

答案 1 :(得分:0)

让我们尝试解构您的代码。 您在奖品列表和电子邮件列表的第一项中找到匹配项,对吗?然后,从奖品列表中删除每个给定的奖品。然后,如果还有奖品,请将其添加到奖品文件中。

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