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

如何通过字符串访问变量?解决字符串与列表拼接TypeError报错

解决你的两个Python问题:字符串拼接错误 + 动态变量访问

嘿,我来帮你拆解这两个问题,一步步搞定它们!

一、先搞定字符串与列表拼接的报错

你遇到的TypeError: cannot concatenate 'str' and 'list' objects,核心原因很简单:你试图把字符串和整个列表直接拼接,但Python只允许字符串和字符串(或能转成字符串的单个元素)拼接。

看你原来的代码:

read_files_2="_"+Case_Num+"_case_"+Case_Type

这里的Case_Num和Case_Type都是列表(比如[2019,2019,...]),不是单个的数字,所以肯定拼不了。你要的是遍历每一组(年份, 类型)的组合,生成对应的字符串模式,对吧?这时候应该用zip()把两个列表配对,逐个取出元素来生成字符串。

二、关于“用字符串访问变量”的正确姿势

直接通过字符串(比如"_2019_case_1")去访问同名变量,不是Python的推荐写法——这种方式容易出错,代码可读性也差。更稳妥的做法是用字典来存储这些案例列表:把"_2019_case_1"这类字符串作为键,对应的空列表作为值,之后要访问时直接用字典的键就能拿到对应的列表。

修正后的完整代码

import os

# 用字典替代零散的变量,管理起来更方便
case_dict = {
    "_2019_case_1": [],
    "_2019_case_2": [],
    "_2019_case_3": [],
    "_2020_case_1": [],
    "_2020_case_2": [],
    "_2020_case_3": [],
    "_2024_case_1": [],
    "_2024_case_2": [],
    "_2024_case_3": [],
    "_2029_case_1": [],
    "_2029_case_2": [],
    "_2029_case_3": []
}

Case_Num = [2019,2019,2019,2020,2020,2020,2024,2024,2024,2029,2029,2029] 
Case_Type = [1,2,3,1,2,3,1,2,3,1,2,3] 
dr = "F:\\C\\FE\\CD\\Tran\\ctg" 
read_files =[] 

# 先生成所有需要匹配的文件名模式(比如"_2019_case_1")
target_patterns = [f"_{year}_case_{typ}" for year, typ in zip(Case_Num, Case_Type)]

# 遍历目录下的所有文件
for root, _, files in os.walk(dr): 
    for file in files: 
        # 检查当前文件名是否包含任意一个目标模式
        if any(pattern in file for pattern in target_patterns):
            full_path = os.path.join(root, file)
            read_files.append(full_path)
            
            # 如果需要把文件路径对应到具体的case列表里
            for pattern in target_patterns:
                if pattern in file:
                    case_dict[pattern].append(full_path)
                    break

关键改动说明

  1. 修复拼接错误:用zip(Case_Num, Case_Type)把年份和类型一一配对,再用f-string生成每个目标模式字符串——这样得到的是字符串列表,完全符合拼接要求。
  2. 优化变量访问:把原来的_2019_case_1这类零散变量换成字典case_dict,之后要访问对应列表时,直接写case_dict["_2019_case_1"]就可以,安全又清晰。
  3. 简化文件匹配:预先生成所有目标模式,遍历文件时用any()快速判断是否匹配,逻辑更高效。

如果实在要坚持用字符串访问原来的全局变量(真心不推荐),可以用globals()函数,比如globals()["_2019_case_1"]就能拿到对应的列表,但这种方式容易因为拼写错误引发异常,维护起来很麻烦,所以还是字典的方式更好。

内容的提问来源于stack exchange,提问作者joe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:04:54