Python列表推导式提取文件名指定子串报错求助
Python提取文件名指定区间数字的问题与修复
需求与错误代码
使用Python 3.11.1,需要从file00列表的文件名中提取_dg和.csv之间的数字,期望结果为['89603','89641'],错误代码如下:
file00 = ['Stats_d2023-07-15_dg89603.csv', 'Stats_d2023-07-15_dg89641.csv'] # 获取子字符串索引 idx1 = [fn.find("_dg") for fn in file00] idx2 = [fn.find(".csv") for fn in file00] dgs = [fn[idx1 + len(fn) + 1: idx2] for fn in file00]
报错信息
>>> file00 = ['Stats_d2023-07-15_dg89603.csv', 'Stats_d2023-07-15_dg89641.csv'] >>> >>> # 获取子字符串索引 >>> idx1 = [fn.find("_dg") for fn in file00] >>> idx2 = [fn.find(".csv") for fn in file00] >>> >>> dgs = [fn[idx1 + len(fn) + 1: idx2] for fn in file00] Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 1, in <listcomp> TypeError: can only concatenate list (not "int") to list
问题分析
你的怀疑完全正确:idx1和idx2都是包含两个元素的列表,在列表推导式里直接把整个列表和整数len(fn)+1相加,属于类型不匹配,触发报错。另外就算你拿到单个文件名的_dg位置,切片起始位置的计算也逻辑错误——应该是_dg的起始索引加上_dg的长度(3),而不是加len(fn)+1。
修复方案
方案1:修正原代码的列表遍历逻辑
用zip同时遍历文件名、idx1和idx2的对应元素,修正切片计算:
file00 = ['Stats_d2023-07-15_dg89603.csv', 'Stats_d2023-07-15_dg89641.csv'] idx1 = [fn.find("_dg") for fn in file00] idx2 = [fn.find(".csv") for fn in file00] # 按位置对应遍历三个序列,取正确的切片区间 dgs = [fn[i1 + len("_dg") : i2] for fn, i1, i2 in zip(file00, idx1, idx2)] print(dgs) # 输出: ['89603', '89641']
方案2:用字符串分割简化代码
直接通过两次分割提取目标内容,无需计算索引:
file00 = ['Stats_d2023-07-15_dg89603.csv', 'Stats_d2023-07-15_dg89641.csv'] dgs = [fn.split("_dg")[1].split(".csv")[0] for fn in file00] print(dgs) # 输出: ['89603', '89641']
方案3:用正则表达式(更健壮)
如果文件名格式可能有变化,正则表达式能精准匹配数字部分:
import re file00 = ['Stats_d2023-07-15_dg89603.csv', 'Stats_d2023-07-15_dg89641.csv'] # 匹配_dg后面的数字,直到.csv之前 pattern = re.compile(r'_dg(\d+)\.csv') dgs = [pattern.search(fn).group(1) for fn in file00] print(dgs) # 输出: ['89603', '89641']
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

