You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python读取.dat转CSV后数据全在一列,如何拆分列?

问题描述

我知道这可能是个非常基础且重复的问题,但我在读取.dat文件时遇到了瓶颈。我有一个.dat文件,尝试将其当作CSV读取,该文件内容开头部分如下(其余行与第18行类似):

#Occultation start (UTC): 2020-02-23 00:04:22
#Occultation stop  (UTC): 2020-02-23 00:06:40
#Occultation point latitude (degN):    28.0
#Occultation point longitude (degE):  -17.1
#Center of curvature (m):    11574.705   -3554.708  -13613.902
#Radius of curvature (m):  6369130.294
#Azimuth (degN):    129.789
#Undulation (m):     44.336
#Elevation (m):       0.000
#Processing method:  Wave optics (CT2)
#Background data:    ECMWF forecast 
#Receiver data type: L1caL2p
#Navbit correction:  extern
#Occultation type:   Rising 
#OL/CL mode:         OL->CL
#Alt OL/CL (m):   11884
#alt w.r.t. EGM96 geoid|lat|lon|azimuth|ba_opt|impact_opt|refrac|dry_press|dry_temp|geopotential height|ba_raw|ba_L1|ba_L2|ba_model|snr_L1|snr_L2
          0.000  -99999000.000  -99999000.000  -99999000.000   -0.99999E+08  -99999000.000   -0.99999E+08  -99999000.000  -99999000.000  -99999000.000   -0.99999E+08   -0.99999E+08   -0.99999E+08   -0.99999E+08  -99999000.000  -99999000.000

我尝试通过以下代码移除前17行表头并保存为新文件:

newfile=[]
for line in file[17:]:
    newfile.append(line.strip())
with open('newfile.csv','w') as line:
    for element in newfile:
        line.write(element+ "\n")

随后使用pandas读取该CSV文件:

import pandas as pd
df = pd.read_csv('newfile.csv',sep=',')
print(df.head())

结果所有数据被合并到1列共600行,我尝试了冒号、分号等多种分隔符均无效,请问如何拆分列?


解决方案

你的数据是多个连续空格分隔的,不是逗号或其他符号,以下两种方法可解决:

方法1:直接读取原.dat文件(推荐)

无需转存为csv,直接用pandas处理原文件,跳过注释行并正确解析分隔符:

import pandas as pd

# 读取原.dat文件,提取表头
with open('你的文件路径.dat', 'r') as f:
    # 获取第17行(索引16)的表头,按|拆分并去除空格
    header_cols = [col.strip() for col in f.readlines()[16].split('|')]

# 读取数据,跳过前17行注释,用任意数量空格作为分隔符
df = pd.read_csv(
    '你的文件路径.dat',
    skiprows=17,
    sep=r'\s+',  # 正则匹配任意数量空白字符
    names=header_cols
)
print(df.head())

方法2:读取你生成的newfile.csv

如果保留已生成的newfile.csv,读取时指定空格分隔即可:

import pandas as pd

df = pd.read_csv('newfile.csv', sep=r'\s+')
print(df.head())

关键说明

  • sep=r'\s+'是正则表达式,能匹配任意数量的空格、制表符等空白字符,完美适配你的数据格式。
  • 表头行用|分隔,所以需要单独提取并拆分,确保DataFrame的列名正确对应。

内容的提问来源于stack exchange,提问作者bah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 19:00:31