我有一个具有以下结构的文件(第一行是标题,文件名是test.dat
):
ID_OBS LAT LON ALT TP TO LT_min LT_max STATIONNAME
ALT_NOA_000 82.45 -62.52 210.0 FM 0 0.0 24.0 Alert, Nunavut, Canada
如何指示pandas将整个电台名称(在本例中为 Alert,Nunavut,Canada )作为单元素读取?我在代码中使用delim_whitespace=True
,但这不起作用,因为工作站名称包含空格字符。
运行:
import pandas as pd
test = pd.read_csv('./test.dat', delim_whitespace=True, header=1)
print(test.to_string())
产地:
ID_OBS LAT LON ALT TP TO LT_min LT_max STATIONNAME
ALT_NOA_000 82.45 -62.52 210.0 FM 0 0.0 24.0 Alert, Nunavut, Canada
快速阅读教程并没有帮助。我在这里缺少什么?
答案 0 :(得分:2)
我经常通过编写自己的小解析器来解决这些问题。一般来说,有一些方法可以根据您的意愿弯曲熊猫,但我发现这种方式通常更容易:
<强>代码:强>
import re
def parse_my_file(filename):
with open(filename) as f:
for line in f:
yield re.split(r'\s+', line.strip(), 8)
# build the generator
my_parser = parse_my_file('test.dat')
# first element returned is the columns
columns = next(my_parser)
# build the data frame
df = pd.DataFrame(my_parser, columns=columns)
print(df)
<强>结果:强>
ID_OBS LAT LON ALT TP TO LT_min LT_max \
0 ALT_NOA_000 82.45 -62.52 210.0 FM 0 0.0 24.0
STATIONNAME
0 Alert, Nunavut, Canada
答案 1 :(得分:1)
您粘贴的示例文件有点含糊不清:例如,如果看起来像几个空格的内容是标签,则无法通过眼睛判断。
一般来说,请注意,普通的旧Python比Pandas或CSV模块更具表现力(Pandas&s;强度在其他地方)。例如,甚至有用于递归下降解析器的Python模块,Pandas显然缺乏这些模块。您可以使用常规Python将文件操作为更容易的形式,以便Pandas进行解析。例如:
import re
>>> ['@'.join(re.split(r'[ \t]+', l.strip(), maxsplit=8)) for l in open('stuff.tsv') if l.strip()]
['ID_OBS@LAT@LON@ALT@TP@TO@LT_min@LT_max@STATIONNAME',
'ALT_NOA_000@82.45@-62.52@210.0@FM@0@0.0@24.0@Alert, Nunavut, Canada']
将分隔符更改为'@'
,例如,如果您回写文件,则可以使用delimiter='@'
进行解析。