Python密码管理器CSV平台校验报错:TypeError及lower方法问题排查
解决密码管理器的输入校验与CSV匹配问题
嘿,我来帮你搞定这几个代码问题,一步步梳理清楚:
1. 第一个奇怪输出的根源:lower方法没调用
你最初写的input("introduce platform:").lower少了关键的括号!lower是字符串的实例方法,必须加()才能执行并返回小写后的字符串,不然你存到newline里的是方法对象本身,所以打印时才会出现<built-in method lower of str object...>这种奇怪内容。
正确写法应该是:
input("introduce platform:").lower()
2. TypeError: 'int' object is not subscriptable的解决
报错行if newline[0]==datatoread[x[0]]:的问题很明确:
x是range(len(datatoread))生成的整数(比如0、1、2...),你写x[0]相当于给整数做下标操作,这当然会报错!datatoread是CSV读取后转成的列表的列表,每一个元素是一行数据(比如['Platform', 'Username', 'Password']),要取第x行的第0列(平台名),应该写成datatoread[x][0]。
3. 循环逻辑的优化(避免漏检重复平台)
你的原代码里for循环内的break会导致只检查第一行就退出,这样如果重复平台在第二行及以后,根本检测不到。正确的逻辑应该是:
- 每次输入平台后,先假设没有重复(
check=True) - 遍历所有行,只要找到匹配的平台,就设置
check=False并跳出循环 - 根据
check的结果决定是否保留输入或提示用户重新输入
修正后的完整代码片段
import csv reqfile = "passwords.csv" check = False newline = [] # 用with语句自动管理文件,避免资源泄漏 with open(reqfile, 'r', encoding='utf-8') as fo: data = csv.reader(fo) datatoread = list(data) while not check: # 加strip去除前后空格,lower统一小写,避免大小写或空格导致的误判 platform = input("introduce platform:").strip().lower() # 跳过表头匹配(可选,避免用户输入表头文字) if platform == datatoread[0][0].lower(): print("请不要输入表头名称,请输入实际平台名!") continue # 先默认没有重复 check = True # 从第1行开始遍历,跳过表头行 for row in datatoread[1:]: if platform == row[0].lower(): print("你已经为该平台设置过账号密码了,请更换平台名称!") check = False break # 确认无重复后再加入列表 if check: newline.append(platform)
额外小建议
- 始终用
with open(...)操作文件,它会自动帮你关闭文件,比手动fo.close()更安全 - 对用户输入做
strip()处理,避免不小心输入的前后空格导致匹配失败 - 遍历CSV行时直接用
for row in datatoread[1:],比用range加下标更直观,也能避免下标错误
内容的提问来源于stack exchange,提问作者David Garcia Ricou
相关产品推荐
相关产品推荐

