asccol
ASCII Columnar Data Parser
Use this simple library to parse aligned text data into Python named tuples, using your own specifications for keyword, type, and column width.
Example usage
import math
import sys
from asccol import DataSpec, Columns, parse_data
def simple_time(s):
"""Convert a HHMM string to an (H, M) tuple."""
hour = s[:2]
minute = s[2:4]
return tuple(map(int, (hour, minute)))
def filtered_float(s):
"""Like float, but ignore the special value 444.0."""
val = float(s)
return val if val != 444.0 else math.nan
# 10 minute data
# See https://amrc.ssec.wisc.edu/data/ftp/pub/aws/q10/q10readme.txt
Q10 = DataSpec(
leading=2, # lines to delete
cols=Columns(
('year', int, 4), # keyword, type (converter function), width
('jdate', int, 4),
('month', int, 3),
('date', int, 3),
('time', simple_time, 5),
('temp', filtered_float, 7),
('pressure', filtered_float, 7),
('wind_speed', filtered_float, 7),
('wind_dir', filtered_float, 7),
('rel_hum', filtered_float, 7),
('delta_t', filtered_float, 7),
),
)
for row in parse_data(sys.stdin, Q10):
print(row)
The program above will transform this input:
Year: 2021 Month: 02 ID: BYD ARGOS: 8903 Name: Byrd
Lat: 80.02S Lon: 119.44W Elev: 1539m
2021 32 2 1 0000 -16.3 803.9 8.9 22.0 79.0 444.0
2021 32 2 1 0010 -16.4 803.9 8.6 25.0 79.0 444.0
...into this output:
row(year=2021, jdate=32, month=2, date=1, time=(0, 0), temp=-16.3, pressure=803.9, wind_speed=8.9, wind_dir=22.0, rel_hum=79.0, delta_t=nan)
row(year=2021, jdate=32, month=2, date=1, time=(0, 10), temp=-16.4, pressure=803.9, wind_speed=8.6, wind_dir=25.0, rel_hum=79.0, delta_t=nan)