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

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没有加引号,或者列表整体结构有缺失。

修复步骤

  1. 修正文件格式:确保Accounts2.txt内容是标准的Python列表格式,例如:
[["user1","pass1"],["user2","pass2"],["user3","pass3"]]
  1. 用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 19:08:15