如何用Pandas读取列数可变的文本文件并生成DataFrame?
解决方法:拆分文件内容为多个DataFrame
你的问题根源在于文件包含3种不同列数的结构化数据块,直接用read_csv一次性读取会因为列数不匹配报错。要保留所有行的同时正确解析,我们可以先手动拆分不同的数据块,再分别构建DataFrame。
具体实现步骤
- 先读取文件的所有行,按制表符分割字段;
- 根据每行的字段数量,拆分出三个独立的数据块(基本参数、时间参数、航点列表);
- 为每个块单独创建DataFrame,保留各自的表头和数据。
import pandas as pd # 读取目标文件的所有行,过滤空行并按制表符拆分字段 file_path = "D:/waypoints/route/" + file[0] with open(file_path, 'r') as f: # 处理每一行:去除首尾空白,按制表符分割成字段列表 all_lines = [line.strip().split('\t') for line in f if line.strip()] # 拆分第一个数据块:船舶基本参数(6列,前2行) block1_header = all_lines[0] block1_data = [all_lines[1]] # 转成列表格式适配DataFrame构造 df_basic = pd.DataFrame(block1_data, columns=block1_header) # 拆分第二个数据块:时间参数(10列,第3-4行) block2_header = all_lines[2] block2_data = [all_lines[3]] df_time = pd.DataFrame(block2_data, columns=block2_header) # 拆分第三个数据块:航点列表(20列,从第5行开始) block3_header = all_lines[4] block3_data = all_lines[5:] df_waypoints = pd.DataFrame(block3_data, columns=block3_header)
说明
- 三个DataFrame分别对应文件里的三类信息:
df_basic存储船舶功率、速度等基础配置,df_time存储出发/到达时间,df_waypoints存储所有航点的详细数据; - 这种方式完全保留了文件的所有内容,不需要跳过任何行;
- 如果确实需要把所有数据合并到一个DataFrame,建议给每个块添加一个
data_type标识列(比如"basic_info"、"time_info"、"waypoint"),再用pd.concat合并,但从数据逻辑来说,分开存储会更清晰易用。
内容的提问来源于stack exchange,提问作者Dheeraj
相关产品推荐
相关产品推荐

