Python读取文件时执行int(float(img_id))触发字符串转float报错求解
问题排查与解决方案
错误原因
- 报错触发在
idx = int(float(img_id))行,和你猜测的文件内部空格无关,错误根源是你通过固定切片img_metas[0]['filename'][34:40]得到的img_id不是纯数字字符串,包含非数字字符(比如路径分隔符、文件名后缀、前后空格等),无法转换为浮点类型。 - 固定位置切片的逻辑鲁棒性极差:只要文件路径长度变动、存储路径调整,切片得到的内容就会偏离预期的6位数字编号,是非常容易触发错误的写法。
修复步骤
第一步:定位异常值
先在切片后加打印语句,确认img_id的实际内容:
img_id = img_metas[0]['filename'][34:40] # 前后加竖线可以直观看到是否有隐藏的前后空格 print(f"切片得到的img_id内容:|{img_id}|")
第二步:替换稳定的编号提取逻辑
不要使用固定切片,改用从文件名提取数字的通用逻辑:
import os # 先去掉路径前缀,只保留纯文件名 base_filename = os.path.basename(img_metas[0]['filename']) # 提取文件名中所有数字字符,取前6位作为编号 img_id = ''.join([c for c in base_filename if c.isdigit()])[:6] # 纯数字字符串可以直接转int,不需要先转float idx = int(img_id)
第三步:修复读文件的潜在错误
你现有读取文件的代码也存在空格相关的隐藏bug:line.split(' ')按单个空格分割,遇到连续空格、行首行尾空格时会生成空字符串,后续转float也会触发同类报错,修改为:
with open(box_2d_file) as f: # split()无参数时自动处理所有类型空白、过滤空值,加判断跳过空行 arrays = [list(map(float, line.split())) for line in f if line.strip()]
可选:增加异常捕获
如果要避免单张样本异常导致整个程序崩溃,可以加异常处理逻辑:
try: idx = int(img_id.strip()) except ValueError as e: print(f"编号提取失败,img_id内容:{img_id},错误信息:{e}") # 此处可补充跳过当前样本、或者使用默认编号的逻辑
内容的提问来源于stack exchange,提问作者Nita Khanal
相关产品推荐
相关产品推荐

