You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

问题原因

  1. 错误的嵌套循环逻辑:代码中那段for x in rows:内部的for y in range(len(count))完全多余且逻辑错误。它遍历0到len(count)-1的数字并转成字符串,由于y == ","永远不成立(y是数字字符串),trigger一直为False,所有数字都被直接追加到姓名后面,这就是姓名后出现长数字串的原因。
  2. 累加变量未更新:计算总抽奖券数时,count5+1没有赋值操作,应该写成count5 += 1,否则会一直累加第一个元素的值。
  3. 随机数范围错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 23:13:16