Python字符串转嵌套列表及用户认证脚本问题求助
Python登录认证脚本问题解决
问题背景
我需要编写一个Python脚本实现以下功能:
- 打开
Accounts2.txt文件,文件内容为字符串形式的嵌套列表,每个子列表格式为[username,password] - 将文件中的字符串转换为可操作的Python嵌套列表
- 检查每个子列表是否与
[CheckName,CheckPass]匹配,匹配则提示登录成功,全部不匹配才提示登录失败
当前使用的代码:
CheckName = "user3" CheckPass = "pass3" path = "C:\\Users\\drago\\Desktop\\PythonPractice\\Accounts2.txt" InFile = open(path, "r") CredentialsString = str(InFile.read()) print(CredentialsString) InFile.close() CredentialsList = CredentialsString.split("]][[") i=0 for i in range(len(CredentialsList)): print(CredentialsList[i]) if [CheckName,CheckPass] == CredentialsList[i]: print("Login successful") else: print("Login unsuccessful")
遇到的问题
- 字符串转列表失败:用
split("]][[")无法正确转换为嵌套列表,会丢失格式信息 - 认证逻辑错误:每检查一个不匹配的凭证就输出“Login unsuccessful”,而非全部检查完毕后才提示失败
之前尝试用ast.literal_eval转换但报错,代码及错误信息:
import ast CredentialsList = ast.literal_eval(CredentialsString) print(CredentialsList)
报错内容:
File "C:\Users\drago\OneDrive\Desktop\Python374\Softwares\Lib\ast.py", line 71, in _raise_malformed_node raise ValueError(msg + f': {node!r}') ValueError: malformed node or string on line 1: <ast.Name object at 0x000002E4CADBD5D0>
解决方案
一、解决字符串转嵌套列表问题
为什么ast.literal_eval报错?
ast.literal_eval只能解析合法的Python字面量,要求:
- 字符串必须用单引号/双引号包裹
- 列表的括号、逗号格式完全正确
你的报错说明Accounts2.txt里的内容格式不合法,比如子列表中的username或password没有加引号,或者列表整体结构有缺失。
修复步骤
- 修正文件格式:确保
Accounts2.txt内容是标准的Python列表格式,例如:
[["user1","pass1"],["user2","pass2"],["user3","pass3"]]
- 用
ast.literal_eval正确转换:配合with语句安全管理文件(自动关闭):
import ast path = "C:\\Users\\drago\\Desktop\\PythonPractice\\Accounts2.txt" with open(path, "r") as InFile: CredentialsString = InFile.read().strip() # 去除首尾空白/换行 try: CredentialsList = ast.literal_eval(CredentialsString) except ValueError as e: print(f"文件格式错误:{e}") exit()
如果暂时无法修改文件格式,也可以手动处理split后的内容补全格式(兼容性较差,优先推荐上面的方法):
CredentialsList = CredentialsString.split("]][[") # 修复首尾元素的括号 CredentialsList[0] = CredentialsList[0].lstrip("[") CredentialsList[-1] = CredentialsList[-1].rstrip("]") # 分割每个元素为用户名和密码,去除多余引号和空白 processed_list = [] for item in CredentialsList: parts = [p.strip().strip('"').strip("'") for p in item.split(",")] processed_list.append(parts) CredentialsList = processed_list
二、修复认证逻辑错误
正确逻辑应该是:设置一个标记变量,遍历过程中找到匹配项就标记成功并终止循环,遍历结束后根据标记输出结果。
修改后的认证代码:
login_success = False for cred in CredentialsList: # 先验证子列表格式正确 if isinstance(cred, list) and len(cred) == 2: if cred[0] == CheckName and cred[1] == CheckPass: login_success = True break # 找到匹配项后停止遍历 # 遍历结束后统一输出结果 print("Login successful" if login_success else "Login unsuccessful")
完整修复代码
import ast CheckName = "user3" CheckPass = "pass3" path = "C:\\Users\\drago\\Desktop\\PythonPractice\\Accounts2.txt" # 读取并解析文件内容 with open(path, "r") as InFile: CredentialsString = InFile.read().strip() try: CredentialsList = ast.literal_eval(CredentialsString) except ValueError as e: print(f"无法解析文件内容:{e}") exit() # 验证登录凭证 login_success = False for cred in CredentialsList: if isinstance(cred, list) and len(cred) == 2: if cred[0] == CheckName and cred[1] == CheckPass: login_success = True break print("Login successful" if login_success else "Login unsuccessful")
内容的提问来源于stack exchange,提问作者aw92
相关产品推荐
相关产品推荐

