Как конвертировать CPP фред в Python, используя Numpy из файла? - PullRequest
0 голосов
/ 02 апреля 2020

У меня большой файл (16 Мб), который был написан с использованием ccode. Я хотел бы прочитать данные в Python (и использовать Numpy)

Вот (упрощенный) код для чтения данных:

    typedef struct
    {
        int32 c;
        int32 g;
        double l;
        double h;
        double n;
        short S;
        int32 w[100];
        short A;
        short P;
        short D;
        short W;
        char E[256];
        char T[512];
    }H;

    myfile = open("my_binary_file.dat", "rb")

    fseek(myfile, 0, SEEK_SET);
    fread(&H.c, sizeof(int32), 1, myfile);
    fread(&H.g, sizeof(int32), 1, myfile);
    fread(&H.l, sizeof(double), 1, myfile);
    fread(&H.h, sizeof(double), 1, myfile);
    fread(&H.n, sizeof(double), 1, myfile);
    fread(&H.S, sizeof(short), 1, myfile);
    fread(H.w, sizeof(int32), 100, myfile);
    fread(&H.A, sizeof(short), 1, myfile);
    fread(&H.P, sizeof(short), 1, myfile);
    fread(&H.D, sizeof(short), 1, myfile);
    fread(&H.W, sizeof(short), 1, myfile);
    fread(H.E, sizeof(char), 256, myfile);
    fread(H.T, sizeof(char), 512, myfile);

Я попробовал несколько вещи, но не могу заставить его работать с numpy "fromfile". Вот то, что я думаю, будет работать, и это «работает», но я не могу понять смысл строки символов.

    import numpy as np
    from dataclasses import dataclass

    @dataclass
    class H: 
        c: int
        g: int
        l: float
        h: float
        n: float
        S: int
        w: list    
        A: int
        P: int
        D: int
        W: int
        E: list
        T: list

    myfile = open("my_binary_file.dat", "rb")

    H.c = np.fromfile(myfile, dtype=np.dtype(np.int32), count=1, offset=0)
    H.g = np.fromfile(myfile, dtype=np.dtype(np.int32), count=1, offset=1)
    H.l = np.fromfile(myfile, dtype=np.dtype(np.double), count=1, offset=2)
    H.h = np.fromfile(myfile, dtype=np.dtype(np.double), count=1, offset=3)
    H.n = np.fromfile(myfile, dtype=np.dtype(np.double), count=1, offset=4)
    H.S = np.fromfile(myfile, dtype=np.dtype(np.int), count=1, offset=5)
    H.w = np.fromfile(myfile, dtype=np.dtype(np.int32), count=100, offset=6)
    H.A = np.fromfile(myfile, dtype=np.dtype(np.int), count=1, offset=106)
    H.P = np.fromfile(myfile, dtype=np.dtype(np.int), count=1, offset=107)
    H.D = np.fromfile(myfile, dtype=np.dtype(np.int), count=1, offset=108)
    H.W = np.fromfile(myfile, dtype=np.dtype(np.int), count=1, offset=109)
    H.E = np.fromfile(myfile, dtype=np.dtype(np.byte), count=256, offset=110)
    H.T = np.fromfile(myfile, dtype=np.dtype(np.byte), count=512, offset=366)

Кто-нибудь знает, как использовать Numpy fromfile для преобразования двоичных данных в правильный формат?

...