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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 22:47:40