pandas DataFrame无法正确读取生成的仅含float64温度列的CSV文件
问题原因
- 你在Notepad++里看到的「NUL」不是普通文本字符串
"NUL",是ASCII码为0的空控制字符(转义表示为\x00)。你现有代码替换的是字符串"NUL",完全无法处理这个不可见控制字符,导致最终写入CSV的温度值前缀带有\x00。 - pandas解析数值类型时,遇到字段开头的不可见控制字符,会判定内容不是合法数值,直接转换为NaN。而你用Notepad++打开文件并手动保存时,软件会自动过滤掉文件中的
\x00空控制字符,因此保存后的文件可以被pandas正常解析。
解决方案
方法1:预处理阶段直接清除空控制字符
把原有替换逻辑中针对"NUL"的替换,改为直接清除\x00字符,同时可以配合正则提取严格过滤温度数值,避免其他异常字符干扰:
import re lines = f.readlines() processed_temp = [] for line in lines: # 清除空控制字符和方括号 line = line.replace("[", " ").replace("\x00", "") # 正则匹配提取温度数值,避免其他冗余内容混入 temp_res = re.search(r"Temp:\s*(\d+\.\d+)C", line) if temp_res: processed_temp.append(temp_res.group(1)) # 后续将processed_temp的内容写入CSV即可
方法2:读取CSV时做数据清洗
如果已经生成了带异常字符的CSV文件,也可以在pandas读取阶段对温度列做清洗后再转换类型:
import pandas as pd # 先以字符串类型读取所有列,避免提前转数值产生NaN df = pd.read_csv("temp.csv", dtype=str) # 清除温度列中所有非数字、小数点的字符,再转float类型 df["温度列名"] = df["温度列名"].str.replace(r"[^\d.]", "", regex=True).astype("float64")
内容的提问来源于stack exchange,提问作者Doug Nguyen
相关产品推荐
相关产品推荐

