Python抽奖脚本问题:姓名后莫名追加0-41数字串求助
抽奖脚本姓名追加数字问题排查与解决
我有一个两列的.csv文件,第一列是人名,第二列是该用户持有的抽奖券数量。编写了Python脚本用于随机抽取中奖券并匹配返回获奖者姓名,但运行后每个姓名后都会追加一串0到41的数字串,求问题原因与解决方法。
CSV输入示例
jame,18
nico,19
silv,48
kevy,23
Chri,22
错误输出示例
jame01234567891011121314151617181920212223242526272829303132333435363738394041 nico01234567891011121314151617181920212223242526272829303132333435363738394041 silv01234567891011121314151617181920212223242526272829303132333435363738394041 kevy01234567891011121314151617181920212223242526272829303132333435363738394041 Chri01234567891011121314151617181920212223242526272829303132333435363738394041
期望输出示例
jame
nico
silv
kevy
Chri
当前代码
import csv import random file = open("C:\\Users\\Username\\Desktop\\raffle.csv") type(file) csvreader = csv.reader(file) rows = [] for row in csvreader: rows.append(row) rows file.close() names = [] count = [] counter = 0 for x in rows: names.append(x[0]) # Assuming the name is in the first column count.append(x[1]) for x in rows: trigger = False for y in range(len(count)): y = str(y) if y == ",": trigger = True if trigger == True: count[counter] += y else: names[counter] += y counter+=1 TotalEntries = 0 # This is the total amount of entries. count5 = 0 print(*names) for x in count: TotalEntries += int(count[count5]) count5+1 winner = random.randint(0, TotalEntries) countWin = 0 win = "" countOut = 0 for x in count: # # Runs through the list of raffle entries for y in range(len(count)): if countWin == winner: win = names[countOut] countWin+=1 countOut+=1 winNum = str(winner) print("The winner is number "+winNum+", "+win)
问题原因
- 错误的嵌套循环逻辑:代码中那段
for x in rows:内部的for y in range(len(count))完全多余且逻辑错误。它遍历0到len(count)-1的数字并转成字符串,由于y == ","永远不成立(y是数字字符串),trigger一直为False,所有数字都被直接追加到姓名后面,这就是姓名后出现长数字串的原因。 - 累加变量未更新:计算总抽奖券数时,
count5+1没有赋值操作,应该写成count5 += 1,否则会一直累加第一个元素的值。 - 随机数范围错误:
random.randint(0, TotalEntries)的范围包含了TotalEntries,但抽奖券序号是从0到TotalEntries-1,会导致越界风险。
解决方法
删除错误的嵌套循环,修正累加逻辑,调整随机数范围,同时优化代码结构(比如用with语句自动管理文件)。
修正后的代码
import csv import random # 用with语句自动管理文件,避免手动关闭的问题 with open("C:\\Users\\Username\\Desktop\\raffle.csv", "r") as file: csvreader = csv.reader(file) rows = list(csvreader) names = [] counts = [] for row in rows: names.append(row[0]) # 直接转成整数存储,简化后续计算 counts.append(int(row[1])) # 计算总抽奖券数 total_entries = sum(counts) # 生成中奖序号,范围是0到total_entries-1,符合序号从0开始的规则 winner_num = random.randint(0, total_entries - 1) current = 0 winner_name = "" # 匹配中奖序号对应的姓名 for name, cnt in zip(names, counts): if current <= winner_num < current + cnt: winner_name = name break current += cnt # 按期望格式打印姓名和结果 print("\n".join(names)) print(f"The winner is number {winner_num}, {winner_name}")
代码说明
- 用
with语句处理文件,自动关闭,更安全简洁。 - 直接将抽奖券数量转成整数存储,避免后续重复类型转换。
- 用
sum(counts)直接计算总券数,替代繁琐的循环累加。 - 通过区间判断匹配中奖者,逻辑清晰易懂。
- 用
"\n".join(names)实现每个姓名单独一行的输出格式。
内容的提问来源于stack exchange,提问作者Joey John
相关产品推荐
相关产品推荐

