我正在从文本文件中读取内容,并将其存储在列表中(每行作为一个元素)(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)
答案 0 :(得分:0)
似乎您可能无意间将其中一个列表(prizeList
或emailList
)截断了,因为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']