如何将TXT文件数值的逗号替换为点?解决np.loadtxt报错问题
解决numpy.loadtxt读取带逗号分隔符数据的转换错误
问题场景
你有如下格式的实验数据:
date/time: ,16/02/2023,10:48 a.m. Run 1 time Velocity 2 0,000000 1,992073E-1 0,016667 1,983866E-1 0,033333 1,982413E-1 0,050000 1,982486E-1 0,066667 1,979145E-1 0,083333 1,980452E-1 0,100000 1,981251E-1 0,116667 1,981542E-1 0,133333 1,977039E-1 0,150000 1,979653E-1 0,166667 1,979435E-1 0,183333 1,979000E-1 0,200000 1,979290E-1 0,216667 1,979072E-1 0,233333 1,980162E-1
尝试用老师提供的代码读取并替换逗号为点:
def load_data_with_comma(archive): def convert_number_with_comma(x: bytes) -> float: return float(x.decode().replace(",", ".")) return np.loadtxt(archive, converters={0: convert_number_with_comma})
运行后报错:
ValueError: could not convert string to float: 'date/time:'
错误原因
np.loadtxt默认读取文件所有行,而前4行(date/time:行、Run 1行、空行、表头行)都不是数值数据,直接读取会触发转换失败- 原代码仅对第0列(time列)做逗号替换,Velocity列的逗号分隔符未处理
解决方法
方法1:跳过非数据行+处理两列转换
修改代码,指定跳过前4行非数据内容,并给两列都设置转换器:
import numpy as np def load_data_with_comma(archive): def convert_number_with_comma(x: bytes) -> float: return float(x.decode().replace(",", ".")) # skiprows=4 跳过前4行;converters为两列都配置转换逻辑 return np.loadtxt(archive, converters={0: convert_number_with_comma, 1: convert_number_with_comma}, skiprows=4)
方法2:用genfromtxt增强容错性
如果数据存在更多不确定的非数据行,np.genfromtxt的参数更灵活:
import numpy as np def load_data_with_comma(archive): def convert_number_with_comma(x): return float(x.decode().replace(",", ".")) if x else np.nan # skip_header=4跳过前4行,invalid_raise=False忽略转换错误,最后过滤空行产生的无效数据 data = np.genfromtxt(archive, converters={0: convert_number_with_comma, 1: convert_number_with_comma}, skip_header=4, invalid_raise=False) return data[~np.isnan(data).any(axis=1)]
方法3:手动逐行读取处理
不依赖numpy内置参数,手动控制读取逻辑:
import numpy as np def load_data_with_comma(archive): data = [] with open(archive, 'r') as f: # 跳过前4行非数据内容 for _ in range(4): next(f) for line in f: line = line.strip() if not line: continue # 分割数据并替换逗号为点 time_str, vel_str = line.split() time = float(time_str.replace(",", ".")) vel = float(vel_str.replace(",", ".")) data.append([time, vel]) return np.array(data)
内容的提问来源于stack exchange,提问作者nicolas otero
相关产品推荐
相关产品推荐

