Я пытаюсь написать программу для преобразования файла CSV в очень конкретный c двоичный файл вывода. Он должен быть записан в формате big endian с различными типами данных, как целыми числами без знака, так и числами с плавающей запятой. Я успешно импортировал CSV в фрейм данных pandas.
Вот пример данных:
val1,val2,val3,val4
1234567890,10000,1,0.839792631
А вот код, который я использую:
import numpy as np
import pandas as pd
inputfilename = r"test_csv.csv"
df = pd.read_csv(inputfilename)
datatype = np.dtype([
('val1', '>u4'),
('val2', '>u2'),
('val3', 'u1'),
('val4', '>f4')])
data = df.to_numpy(dtype=datatype)
outputfilename = r"output_py_1.dat"
fileobj = open(outputfilename, mode='wb')
data.tofile(fileobj)
fileobj.close()
Я написал код, чтобы сделать то же самое в Matlab и проверил в шестнадцатеричном редакторе. Правильный вывод:
49 96 02 D2 27 10 01 3F 56 FC A6 00
Однако Python выводит много посторонних байтов и повторяет некоторые байты, и я не понимаю, почему.
49 96 02 D2 02 D2 D2 4E 93 2C 06 00 00 27 10 27 10 10 46 1C 40 00 00 00 00 01 00 01 01 3F 80 00 00 00 00 00 00 00 00 00 3F 56 FC A6 F2
Есть ли способ, которым я может получить правильный результат?
Я также думаю, что проблема может иметь какое-то отношение к преобразованию в numpy, учитывая, что выходные данные для данных выглядят так с кучей дополнительных чисел (я не даже не знаю откуда они):
array([[(1234567890, 722, 210, 1.234568e+09),
( 10000, 10000, 16, 1.000000e+04),
( 1, 1, 1, 1.000000e+00),
( 0, 0, 0, 8.397926e-01)]],
dtype=[('val1', '>u4'), ('val2', '>u2'), ('val3', 'u1'), ('val4', '>f4')])