使用pandas.read_csv()读取.dat文件报unicode错误问题求助
问题根因说明
文件夹名称包含数字完全不会引发文件读取错误,无需在该点上耗费排查精力。你遇到的错误分两个独立阶段,对应不同根因:
- 初始的
SyntaxError: 'unicodeescape' codec can't decode bytes是Windows路径字符串转义问题 - 路径调整后出现的
EmptyDataError: No columns to parse from file核心原因是.dat并非标准结构化文本格式,你默认用面向文本表格的read_csv读取,和文件实际格式不匹配,和编码、分隔符参数没有直接关系。
分步排查方案
第一步:彻底解决路径转义问题,确认文件可正常访问
不要反复试单引号/双引号、反斜杠数量这类碰运气的写法,用以下代码100%规避转义问题,同时确认文件本身有效:
from pathlib import Path import os # 直接复制资源管理器里的文件路径,把单反斜杠换成正斜杠即可,无需加r标记 file_path = Path("C:/你的实际存储路径/Data.dat") # 先做基础校验 print("文件是否存在:", file_path.exists()) print("文件大小(字节):", os.path.getsize(file_path))
- 如果返回
文件是否存在:False,说明路径抄写错误,重点检查是否开启了系统的文件后缀隐藏(比如实际文件名为Data.dat.txt,你漏写了.txt后缀)、文件夹名是否有拼写错误。 - 如果文件大小为0,说明文件本身是空文件,无需继续后续读取操作。
第二步:判断文件格式,选择对应读取方式
.dat是通用后缀,不代表特定存储格式,你之前直接套用read_csv默认参数是典型的方法错配,先判断文件是纯文本格式还是二进制格式:
# 读取文件前100个字节判断格式 with open(file_path, 'rb') as f: first_100_bytes = f.read(100) print("文件头字节内容:", first_100_bytes)
场景1:输出内容以可识别的常规字符为主,少量特殊字符
说明是纯文本类格式,不要直接用pandas读取,先原生读取前5行确认实际分隔规则:
with open(file_path, 'r', encoding='latin-1') as f: for line_num in range(5): line = f.readline() print(f"第{line_num}行原始内容:", repr(line))
根据打印结果确认行分隔符、列分隔符、需要跳过的头部说明行数量,再把对应参数传给pd.read_csv即可,无需盲目试sep='\s+'这类通用参数。
场景2:输出内容以不可打印的乱码字节为主
说明是二进制存储格式,这类存储常见于其他编程语言(C/Matlab/Numpy)导出的数值型.dat文件,read_csv这类文本读取方法完全无法解析,改用numpy按二进制数值读取即可:
import numpy as np import pandas as pd # 先尝试按32位整数读取,若数值不合理可替换dtype为int16/int64/float32等匹配实际存储类型 data_arr = np.fromfile(file_path, dtype=np.int32) print("读取数组长度:", len(data_arr)) print("前10个数值:", data_arr[:10]) # 读取正常后转成pandas结构即可 df = pd.DataFrame(data_arr)
之前尝试方案无效的原因说明
- 原始字符串标记
r仅能规避大部分转义问题,若路径书写时存在片段缺失、后缀错误,依然会定位到错误文件 - 路径开头加双反斜杠是局域网UNC共享路径的写法,读取本地磁盘文件时使用会直接导致路径定位错误
- 出现
EmptyDataError时优先排查文件格式是否匹配,而非反复调整编码、sep、skiprows参数,二进制文件无论怎么调整文本读取参数都无法正常解析。
内容的提问来源于stack exchange,提问作者Bhanu Chander
相关产品推荐
相关产品推荐

