如何用Pandas抽取随机Steam密钥并移除,同时记录已抽取项?
解决方案:Steam密钥随机抽取与管理
完整实现代码
结合你的需求,修改后的代码可直接实现三个核心功能,同时保证输出简洁:
import pandas as pd # 读取原始密钥列表 df = pd.read_csv('./testCSV.csv') # 初始化已抽取密钥的DataFrame,结构与原始数据一致 used_df = pd.DataFrame(columns=df.columns) # 随机抽取一行(若需一次抽多个,可调整sample的n参数) random_row = df.sample() # 1. 仅打印纯密钥字符串 key_str = random_row['Key'].iloc[0] print(f"抽取的Steam密钥:{key_str}") # 2. 从原始DataFrame中永久移除该行 df.drop(random_row.index, inplace=True) # 3. 将抽取的行添加到已抽取列表 used_df = pd.concat([used_df, random_row], ignore_index=True) # 可选:将更新后的列表写回文件,实现持久化保存 df.to_csv('./testCSV.csv', index=False) used_df.to_csv('./used_keys.csv', index=False)
关键细节说明
- 纯密钥输出:通过
iloc[0]直接定位抽取行的Key列值,避免索引和额外信息干扰;也可使用random_row['Key'].squeeze()达到同样效果。 - 永久移除行:利用
drop()方法删除抽取行对应的索引,inplace=True直接修改原始DataFrame,最后通过to_csv写回文件完成持久化。 - 记录已抽取密钥:初始化与原始数据同结构的空DataFrame,用
pd.concat将抽取行追加进去,ignore_index=True重置索引避免混乱。
优化与扩展建议
- 数据安全备份:每次运行前复制原始CSV文件做备份,防止误操作导致数据丢失。
- 状态持久化:若不想频繁读写CSV,可使用
pickle序列化保存df和used_df的状态,下次运行直接加载:# 保存状态 import pickle with open('key_state.pkl', 'wb') as f: pickle.dump((df, used_df), f) # 加载状态 with open('key_state.pkl', 'rb') as f: df, used_df = pickle.load(f) - 异常处理:添加判断逻辑,当
df为空时提示"已无可用密钥",避免程序报错。 - 轻量替代方案:对于小规模密钥列表,用Python内置的
csv模块和random库即可实现,代码更轻量:import csv import random import os # 读取密钥列表 keys = [] with open('./testCSV.csv', 'r', newline='') as f: reader = csv.DictReader(f) keys = list(reader) if not keys: print("已无可用密钥") else: # 随机抽取 selected = random.choice(keys) print(f"抽取的Steam密钥:{selected['Key']}") # 移除当前密钥 keys.remove(selected) # 写入剩余密钥 with open('./testCSV.csv', 'w', newline='') as f: writer = csv.DictWriter(f, fieldnames=['Product', 'Key']) writer.writeheader() writer.writerows(keys) # 写入已抽取密钥 with open('./used_keys.csv', 'a', newline='') as f: writer = csv.DictWriter(f, fieldnames=['Product', 'Key']) # 文件为空时写入表头 if os.stat('./used_keys.csv').st_size == 0: writer.writeheader() writer.writerow(selected)
内容的提问来源于stack exchange,提问作者TheGreatZackAttack
相关产品推荐
相关产品推荐

