我正在尝试将一个长的.txt
文本表解析为pd.DataFrame
或Python中的其他任何可读形式。我尝试了一种成功的方法,但是我对此并不完全满意,并且确实希望对其进行改进。
这是我的.txt
的子集:
USAF WBAN STATION NAME CTRY ST CALL LAT LON ELEV(M) BEGIN END
007018 99999 WXPOD 7018 +00.000 +000.000 +7018.0 20110309 20130730
007026 99999 WXPOD 7026 AF +00.000 +000.000 +7026.0 20120713 20170822
007070 99999 WXPOD 7070 AF +00.000 +000.000 +7070.0 20140923 20150926
008260 99999 WXPOD8270 +00.000 +000.000 +0000.0 19960101 20100731
008268 99999 WXPOD8278 AF +32.950 +065.567 +1156.7 20100519 20120323
008307 99999 WXPOD 8318 AF +00.000 +000.000 +8318.0 20100421 20100421
008411 99999 XM20 20160217 20160217
008414 99999 XM18 20160216 20160217
008415 99999 XM21 20160217 20160217
008418 99999 XM24 20160217 20160217
010000 99999 BOGUS NORWAY NO ENRS 20010927 20041019
010010 99999 JAN MAYEN(NOR-NAVY) NO ENJA +70.933 -008.667 +0009.0 19310101 20190203
我尝试了以下操作:
测试1 :使用re
解析空格:
with open('test.txt') as f:
lines = f.readlines()
parsed_lines = [re.split("\s+", line) for line in lines]
print(test)
['007018',
'99999',
'WXPOD',
'7018',
'+00.000',
'+000.000',
'+7018.0',
'20110309',
'20130730',
'']
ok 哪个好,但远非最佳,电台名称被拆分为另一个列表元素,仅显示我的regex
能力差。
测试2:使用字符串位置:
with open('/Users/ivan/weather_isd_noaa/data/isd-history.txt') as f:
lines = f.readlines()
colum_names = lines[0]
usaf_code = []
wban = []
station_name = []
country = []
us_state = []
call = []
lat = []
lon = []
elevation = []
begin = []
end = []
for line in lines:
usaf_code.append(line[:6])
wban.append(line[7:12])
station_name.append(line[13:43])
country.append(line[43:45])
us_state.append(line[46:50])
call.append(line[51:55])
call.append(line[57:64])
lat.append(line[57:64])
lon.append(line[56:73])
elevation.append(line[74:81])
begin.append(line[82:90])
end.append(line[91:100])
df = pd.DataFrame({
'usaf_code': usaf_code,
'wban': wban,
'station_name': station_name,
'country': country,
'us_state': us_state,
'lat': lat,
'lon': lon,
'elevation': elevation,
'begin': begin,
'end': end
})
这会产生一个很好的pd.DataFrame
,很容易清理。这是一种好方法,但是我敢肯定这不是一个好方法,有什么办法可以改善此功能?我希望这段代码是完美无缺的,并且我不相信那些硬编码的职位。
我知道有些sed
或awk
之类的工具非常有用,但是现在我只能在上面运行python;确保subprocess
可以解决问题,但是我想依靠Python。
答案 0 :(得分:3)
输入法,这肯定看起来像是固定宽度的格式,即每一列都有自己固定数量的字符。
因此,您的问题是什么,应该尝试pd.read_fwf()
。
https://pandas.pydata.org/pandas-docs/version/0.20/generated/pandas.read_fwf.html