Мне нужно прочитать файл типа данных сонара в python. Данные гидролокатора содержат детали океана, используемые для измерения глубины моря. Файл содержит двоичные данные и расширение в формате .s7k.
Тим Робертс искал в Google формат .s7k, но не смог найти никакого решения. Потом только сюда выкладывал.
Затем вам может понадобиться преобразовать его вручную во что-то, что вы МОЖЕТЕ прочитать.
Вы пробовали это?
Есть еще один пример здесь, который может быть полезен. Попробуйте поискать в github вместо google с такими терминами, как s7k py reson sonar и т. д.
@Mercury Получение ошибки ОШИБКА: невозможно установить hyo2-qc==3.5.12 и hyo2-qc==3.5.4, поскольку эти версии пакетов имеют конфликтующие зависимости.
Я скачал образец файла s7k, чтобы проверить, могу ли я его прочитать --- и я смог. (Пример файла, который я использовал для тестирования, можно скачать здесь.)
Во-первых, в новую папку проекта загрузите этот файл dg_formats.py, который содержит список кодов дейтаграмм reson и помощников.
Затем загрузите этот файл reader.py в ту же папку.
Строка № 9 файла reader.py выглядит следующим образом:
from hyo2.openbst.lib.raw.parsers.reson.dg_formats import parse, ResonDatagrams, reson_datagram_code
Измените это на:
from dg_formats import parse, ResonDatagrams, reson_datagram_code
По сути, мы пропускаем установку библиотеки hyo2-qc, мы просто берем код для синтаксического анализа и чтения.
После этого я могу просто сделать:
from pathlib import Path
from reader import Reson
from dg_formats import parse, ResonDatagrams, reson_datagram_code
input_path = Path("20190730_144835.s7k") # the sample I downloaded
sonar_file = Reson(input_path)
sonar_file.is_mapped()
Мы можем проверить атрибуты с помощью класса dict:
>>> sonar_file.__dict__
{'_valid': True,
'data': None,
'map': {7200: [[64, 1564498115590.0002, 334, 386]],
7022: [[466, 1564495196916.9998, 32, 0]],
7001: [[566, 1564495197011.0015, 7699, 0]],
7021: [[8333, 1564498114898.9983, 20116, 0],
[2340566, 1564498116758.9988, 20116, 0],
[5031198, 1564498118618.9995, 20116, 0],
...
'_reson_sync_patt': 65535,
'format_type': 's7k',
'file_length': 88684918,
'file_location': 88684918,
'file_end': True}
Мы также можем увидеть список ключей карты, например:
>>> print(sorted(sonar_file.map.keys()))
[1003, 1012, 1013, 7000, 7001, 7002, 7004, 7007, 7010, 7021, 7022, 7027, 7028, 7058, 7200, 7300, 7503, 7504, 7610]
Это в основном то, что информация находится внутри. Из dg_formats.py мы можем сопоставить код и посмотреть, что к чему. Например, 1003 — это позиция, поэтому:
>>> position_data = sonar_file.get_datagram(ResonDatagrams.POSITION)
>>> print(position_data)
[<dg_formats.Data1003 at 0x7f4946c1c5e0>,
<dg_formats.Data1003 at 0x7f4946c1c130>,
...
...
<dg_formats.Data1003 at 0x7f493e28d880>]
# let's get information of first position
>>> print(position_data[0].__dict__)
{'desc': 'Position', 'time': 1564498113624.0005, 'num_beams_max': 512, 'parse_check': True, 'header_fmt': '<If3d5B', 'header_size': 37, 'datum': 'WGS', 'latency': 0.0, 'latitude': 0.7517794800836651, 'longitude': -1.2341624217514013, 'datum_height': 1.32, 'position_flag': 0, 'qual_flag': 0, 'position_method': 0, 'num_of_satelites': 15}
Не для всех кодов есть хелперы (например, для 7200, 7300, 7503, 7504, 7610 ничего нет), но я надеюсь, что это начало того, как получить информацию из файла!
Mercury, какой инструмент вы используете для доступа / открытия файла s7k
Я не использовал никаких инструментов. Я просто попытался посмотреть, смогу ли я получить информацию из файла s7k с помощью Python, как и заданный вами вопрос!
Спасибо, Меркурий, position_data = sonar_file.get_datagram(ResonDatagrams.POSITION) NameError: имя «ResonDatagrams» не определено
Добавьте эту строку в свой скрипт: from dg_formats import parse, ResonDatagrams, reson_datagram_code
Если вы погуглите «xtf python», самым первым попаданием будет проект GitHub для чтения файлов xtf. Я думаю, что вы не особо искали, прежде чем прийти сюда.