贝利信息

如何正确读取含逗号小数分隔符的DSC数据文件并转换为浮点数进行绘图

日期:2026-01-16 00:00 / 作者:心靈之曲

本文介绍使用 numpy 读取欧洲格式(逗号作小数点)的 dsc 文本数据时,解决 `valueerror: could not convert string to float` 的核心方法——通过 `converters` 参数预处理字符串,实现安全、准确的数值解析与后续绘图。

在差示扫描量热法(DSC)实验中,部分仪器导出的 .txt 数据采用欧洲数字格式:小数点以英文逗号(,)表示,例如 "1,00000e+00" 或 "-7,00000e+

01"。而默认的 np.loadtxt() 仅识别英文句点(.)为小数分隔符,因此直接加载会触发 ValueError。

正确做法是利用 loadtxt 的 converters 参数对指定列(或全部列)进行预处理。注意:converters 接收一个字典(键为列索引,值为转换函数),若需统一处理所有数值列,可传入一个接受字节/字符串并返回处理后字符串的函数,但需配合 encoding 显式指定编码(推荐 "utf-8")。

✅ 推荐解决方案(兼容全列、简洁鲁棒):

import numpy as np

filename = "HA_A001_PBS.txt"
# 使用 converters 预替换所有列中的逗号为句点,并指定编码
data = np.loadtxt(
    filename,
    skiprows=2,
    encoding="utf-8",
    converters={i: lambda s: float(s.decode().replace(",", ".")) 
                for i in range(4)}  # 假设共4列;按实际列数调整 range(n)
)

# 提取变量(列索引从0开始)
t = data[:, 1]        # 时间 [s]
heatflow = data[:, 2] # 热流 [mW]
temp = data[:, 3]     # 温度 [°C]

print("Shape:", data.shape)
print("First few rows:\n", data[:3])

⚠️ 注意事项:

完成加载后,即可无缝进行科学绘图:

import matplotlib.pyplot as plt
plt.figure(figsize=(8, 5))
plt.plot(t, heatflow, 'b-', label='Heat Flow (mW)')
plt.xlabel('Time (s)')
plt.ylabel('Heat Flow (mW)')
plt.title('DSC Heat Flow Curve')
plt.legend()
plt.grid(True)
plt.show()

掌握这一技巧,即可稳定解析各类本地化格式的热分析数据,为后续动力学拟合、峰识别等分析奠定可靠基础。