
Security News
VulnCon 2025: NVD Scraps Industry Consortium Plan, Raising Questions About Reform
At VulnCon 2025, NIST scrapped its NVD consortium plans, admitted it can't keep up with CVEs, and outlined automation efforts amid a mounting backlog.
Main result of parsing: List of QSOs:
qso[fieldname]
or qso.get(fieldname)
(depending on which behavior you want when your field does not exist).Order of QSOs in the list is same as in ADIF file.
Secondary result of parsing: The ADIF headers. This is returned as a Python mapping as well.
Normally, you'd call adif_io.read_from_file(filename)
. But you can
also provide a string with an ADI-file's content, as follows:
import adif_io
qsos, header = adif_io.read_from_string(
"A sample ADIF content for demonstration.\n"
"<adif_ver:5>3.1.0<eoh>\n"
"<QSO_DATE:8>20190714 <time_on:4>1140<CALL:5>LY0HQ"
"<mode:2>CW<BAND:3>40M<RST_SENT:3>599<RST_RCVD:3>599"
"<STX_STRING:2>28<SRX_STRING:4>LRMD<EOR>\n"
"<QSO_DATE:8>20190714<TIME_ON:4>1130<CALL:5>SE9HQ<MODE:2>CW<FREQ:1>7"
"<BAND:3>40M<RST_SENT:3>599<RST_RCVD:3>599"
"<SRX_STRING:3>SSA<DXCC:3>284<EOR>")
After this setup, print(header)
will print out a valid ADIF file start:
<ADIF_VER:5>3.1.0 <EOH>
(This starts with a blank space, as the ADIF spec demands a header must not
start with the <
character.)
And
for qso in qsos:
print(qso)
prints
<QSO_DATE:8>20190714 <TIME_ON:4>1140 <CALL:5>LY0HQ <MODE:2>CW <BAND:3>40M <RST_RCVD:3>599 <RST_SENT:3>599 <SRX_STRING:4>LRMD <STX_STRING:2>28 <EOR>
<QSO_DATE:8>20190714 <TIME_ON:4>1130 <CALL:5>SE9HQ <FREQ:1>7 <MODE:2>CW <BAND:3>40M <DXCC:3>284 <RST_RCVD:3>599 <RST_SENT:3>599 <SRX_STRING:3>SSA <EOR>
So str(qso)
for a single QSO generates that QSO as an ADIF string.
Fine points:
\n
.CALL
and MODE
, are automatically converted to upper case on output.
This is not done systematically (for other fields that would also benefit from this),
and the details may change.Given one qso
dict, you can also have the QSO's start time calculated as a Python datetime.datetime
value:
adif_io.time_on(qsos[0])
If your QSO data also includes TIME_OFF
fields (and, ideally, though
not required, QSO_DATE_OFF
), this will also work:
adif_io.time_off(qsos[0])
ADIF uses a somewhat peculiar 11 character XDDD MM.MMM
format to
code geographic coordinates (fields LAT
or LON
). The more common
format these days are simple floats that code degrees. You can convert
from one to the other:
adif_io.degrees_from_location("N052 26.592") # Result: 52.4432
adif_io.location_from_degrees(52.4432, True) # Result: "N052 26.592"
The additional bool
argument of location_from_degrees
should be
True
for latitudes (N / S) and False
for longitudes (E / W).
There is little ADIF-version-specific here. (Everything should work with ADI-files of ADIF version 3.1.3, if you want to nail it.)
This parser knows nothing about ADIF data types or enumerations. Everything is a string. So in that sense, this parser is fairly simple.
But it does correcly handle things like:
<notes:66>In this QSO, we discussed ADIF and in particular the <eor> marker.
So, in that sense, this parser is somewhat sophisticated.
This parser only handles ADI files. It knows nothing of the ADX file format.
Here is some sample code:
import adif_io
qsos_raw, adif_header = adif_io.read_from_file("log.adi")
# The QSOs are probably sorted by QSO time already, but make sure:
qsos_raw_sorted = sorted(qsos_raw, key = adif_io.time_on)
Pandas / Jupyter users may want to add import pandas as pd
up above and continue like this:
qsos = pd.DataFrame(qsos_raw_sorted)
qsos.info()
FAQs
Input and output of ADIF radio amateur log files.
We found that adif-io demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
At VulnCon 2025, NIST scrapped its NVD consortium plans, admitted it can't keep up with CVEs, and outlined automation efforts amid a mounting backlog.
Product
We redesigned our GitHub PR comments to deliver clear, actionable security insights without adding noise to your workflow.
Product
Our redesigned Repositories page adds alert severity, filtering, and tabs for faster triage and clearer insights across all your projects.