Python: Перевод чисел в HEX, деление пополам и обратно в dec
Умельцы, помогите. Есть текстовый файл с такими строками (в общем там около 50 000 строк):
"name1": 1735166787988,
"name2": 602,
"name1": 2276332667410,
"name2": 606,
"name1": 3680786973529,
"name2": 902,
"name1": 3869765534597,
"name2": 821,
"name1": 551014239434021,
"name2": 983,
"name1": 2135457740068400,
"name2": 428,
"name1": 3022888177941837,
"name2": 655,
"name1": 288880372274581291,
"name2": 881,
"name1": 8590887058832684611,
Нужен скрипт на Питоне, чтобы в этом файле числа "name1" конвертировались в 16тиричную систему, затем делились на две части, одна из которых удалялась бы, а другая конвертировались обратно в десятичные и записывалась вместо числа "name1".
Например первое число "1735166787988". в hex это будет "0000019400000194" делим пополам, одну часть удаляем, одну оставляем (эти две части всегда одинаковые): "00000194" - теперь это число нужно обратно перевести в десятичные = 404 (этот конечный результат нужен в графе name1)
Другие примеры: 2276332667410 => 0000021200000212 => 00000212 => 530
8590887058832684611 => 7738F6437738F643 => 7738F643 => 2000221763
и т.д.
???
Ответы (2 шт):
Ссылаясь на действенное объяснение пользователя, код может выглядеть следующим образом.
with open('hex_dec.txt', 'r') as f:
lines = f.readlines()
for i in range(0, len(lines), 2):
if lines[i].startswith('"name1":'):
name1 = int(lines[i].split(':')[1].strip().rstrip(','))
hex_value = hex(name1)[2:].zfill(16)
half_hex_value = hex_value[:8]
new_name1 = int(half_hex_value, 16)
lines[i] = f'"name1": {new_name1},\n'
# решение задачи, описанной в примере
remainder = new_name1 % 2**32
lines[i] = f'"name1": {remainder},\n'
with open('hex_dec.txt', 'w') as f:
f.writelines(lines)
Конечный результат по Вашим входящим данным, будет иметь следующий вид:

P.s. Чтобы не потерять значения "name2" в текстовом документе, я внес условие if. Вполне вероятно, что в Вашей задаче это может быть реализовано немного по иному.
Скрипт ниже читает входной поток по строкам, отыскивает числа внутри строк (все числа), заменяет их на остаток по модулю 232:
import sys
import re
for line in sys.stdin:
sys.stdout.write(
re.sub('\\d+', lambda m: str(int(m.group(0)) % 2 ** 32), line)
)
Применять так:
$ python cut_numbers.py < input.txt > output.txt