Можно ли в Python создавать бинарные файлы? Конечно можно.
Для этого в Python есть следующие инструменты:
▫️ тип данных bytes и bytearray
▫️ открытие файла в режиме wb (write binary) или rb (read binary)
▫️ модуль struct
Про модуль struct поговорим в первую очередь.
Файл в формате JSON или Yaml внутри себя содержит разметку данных. Всегда можно определить где список начался а где закончился. Где записана строка а где словарь. То есть формат записи данных содержит в себе элементы разметки данных.
В binary-файле данные не имеют визуальной разметки. Это просто байты, записанные один за другим. Правила записи и чтения находятся вне файла.
Модуль struct как раз и помогает с организацией данных в таком файле с помощью определения форматов записи для разных частей файла.
Модуль struct преобразует Python-объекты в массив байт, готовый к записи в файл и имеющий определённый вид.
Для этого всегда следует указывать формат преобразования (или, как оно здесь называется - запаковки).
Формат нужен для того, чтобы выделить достаточное количество байт для записи конкретного типа объекта. В последствии с помощью того же формата будет производиться чтение.
При этом следует помнить что мы говорим о типах языка С а не Python.
Именно формат определяет, что записано в конкретном месте файла, число, строка или что-то еще.
Вот какие токены формата у нас есть.
Помимо этого, первым символом можно указать порядок байтов. На разных системах одни и те же типы данных могут записываться по-разному, поэтому желательно указать конкретный способ из доступных. Если этого не сделать, то используется символ '@', то есть нативный для текущей системы.
В строке формата мы пишем в каком порядке и какие типы собираемся преобразовать в байты.
Запакуем в байты простое число, токен "i".
>>> import struct
>>> struct.pack('=i', 10)
b'\n\x00\x00\x00'
Теперь несколько float, при этом нужно передавать элементы не массивом а последовательностью аргументов.
>>> struct.pack('=fff', 1.0, 2.5, 4.1)
b'\x00\x00\x80?\x00\x00 @33\x83@'
Вместо нескольких токенов можно просто указать нужное количество элементов перед одним токеном, результат будет тот же.
>>> struct.pack('=3f', 1.0, 2.5, 4.1)
b'\x00\x00\x80?\x00\x00 @33\x83@'
Теперь запакуем разные типы
>>> data = struct.pack('=fiQ', 1.0, 4, 100500)
я запаковал типы float, int и unsigned long long (очень большой int, на 8 байт)
b'\x00\x00\x80?\x04\x00\x00...'
Распаковка происходит аналогично, но нужно указать тот же формат, который использовался при запаковке. Результат возвращается всегда в виде кортежа.
>>> struct.unpack('=fiQ', data)
(1.0, 4, 100500)
Как видите, ничего страшного!
#lib#basic
🌎 The giant Trilithon stones at Stonehenge in England each weigh about 25 tons and were transported from over 30 kilometers away. These standing stones date to around 2500 BCE and were arranged in a unique horseshoe pattern that still stands today. ✨
#archaeology⚡#megaliths⚡#history
👉subscribe Interesting Planet
👉more Channels
🌎 Towering over the Peruvian desert, the megalithic complex of Sacsayhuamán features walls made from stone blocks weighing up to 200 tons each. These blocks fit so precisely that even a piece of paper cannot slide between them. ✨
#archaeology⚡#history⚡#megaliths
👉subscribe Interesting Planet
👉more Channels
🌎 Rising above the Jordanian desert, the prehistoric megaliths known as “desert kites” are vast stone structures with funnel-shaped walls stretching for hundreds of meters. Archaeologists have identified more than 6,000 desert kites across the Middle East, mostly built between 7000 BCE and 2000 BCE, likely used to trap wild animals. ✨
#archaeology⚡#megaliths⚡#history
👉subscribe Interesting Planet
👉more Channels
🌎 Looming over the English Channel, the Carnac stones on Guernsey form a megalithic passage grave known as Le Déhus. Built around 3500 BCE, it features a massive stone chamber and carved capstones. The longest stone weighs nearly 10 tons and the site is aligned to the sunrise at midsummer. ✨
#archaeology⚡#megaliths⚡#history
👉subscribe Interesting Planet
👉more Channels
🌎 Hidden in the forests of western Russia, the megalithic dolmens of the Caucasus feature massive stone chambers built from precisely carved granite slabs. Some of these structures date back over 5,000 years and weigh more than 15 tons each, puzzling archaeologists with their construction methods and unknown cultural origins. ✨
#megaliths⚡#archaeology⚡#history
👉subscribe Interesting Planet
👉more Channels
🌎 Stonehenge in England features massive upright stones called sarsens, each weighing up to 25 tons. Built around 2500 BCE, the monument’s purpose is still debated, but recent studies found the stones were transported from over 25 kilometers away on wooden sledges and rollers. ✨
#archaeology⚡#megaliths⚡#history
👉subscribe Interesting Planet
👉more Channels
🌎 The megalithic site of Carnac in Brittany, France, contains over 3,000 standing stones arranged in rows stretching more than 4 kilometers. Erected between 5000 and 3300 BCE, these granite monoliths are among the world’s largest collections of ancient stone alignments. ✨
#archaeology⚡#megaliths⚡#history
👉subscribe Interesting Planet
👉more Channels
🌎 In southern England, the ancient monument of Silbury Hill rises 40 meters and was built over 4,000 years ago using chalk and earth. Archaeologists have never found burials, temples, or inscriptions inside, leaving its purpose mysterious. Silbury Hill is the largest man-made prehistoric mound in Europe. ✨
#archaeology⚡#mystery⚡#megaliths
👉subscribe Interesting Planet
👉more Channels
🌎 The “Plain of Jars” in Laos is scattered with thousands of massive stone jars, some weighing over 10 tons. Archaeologists date them to the Iron Age, around 500 BCE to 500 CE, but their purpose—possibly for funerary or storage rites—remains uncertain. Over 90 jar sites have been documented across the region. ✨
#archaeology⚡#megaliths⚡#mystery
👉subscribe Interesting Planet
👉more Channels
🌎 The Baalbek Trilithon in Lebanon features three enormous stone blocks, each weighing around 800 tons, forming the base of the Roman Temple of Jupiter. These stones are among the heaviest ever used in ancient construction, and were quarried and moved more than 800 meters from their original location. ✨
#archaeology⚡#megaliths⚡#engineering
👉subscribe Interesting Planet
👉more Channels
🌎 Towering in the remote Pacific, the moai statues of Easter Island were carved from volcanic rock between 1400–1650 CE. The heaviest moai weighs around 82 tons, showcasing the islanders’ exceptional engineering with limited technology. ✨
#megaliths⚡#archaeology⚡#engineering
👉subscribe Interesting Planet
👉more Channels
🌎 Rising from the Lebanese landscape, the megalithic stones of Baalbek include the Stone of the Pregnant Woman—one of the world’s largest quarried stones at over 1,000 tons. Ancient builders moved and stacked these limestone giants with such precision that modern engineers still debate the techniques used. ✨
#archaeology⚡#megaliths⚡#engineering
👉subscribe Interesting Planet