如何通过字符串访问变量?解决字符串与列表拼接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
关键改动说明
- 修复拼接错误:用
zip(Case_Num, Case_Type)把年份和类型一一配对,再用f-string生成每个目标模式字符串——这样得到的是字符串列表,完全符合拼接要求。 - 优化变量访问:把原来的
_2019_case_1这类零散变量换成字典case_dict,之后要访问对应列表时,直接写case_dict["_2019_case_1"]就可以,安全又清晰。 - 简化文件匹配:预先生成所有目标模式,遍历文件时用
any()快速判断是否匹配,逻辑更高效。
如果实在要坚持用字符串访问原来的全局变量(真心不推荐),可以用globals()函数,比如globals()["_2019_case_1"]就能拿到对应的列表,但这种方式容易因为拼写错误引发异常,维护起来很麻烦,所以还是字典的方式更好。
内容的提问来源于stack exchange,提问作者joe
相关产品推荐
相关产品推荐

