简体   繁体   中英

Python Binary files.

Hi I am having an issue using unstack in python,

fileID= open('B1b1_t100000.beam','r');
npart = 1E6;
ncoord = 7;
coords = np.reshape(struct.unpack('d'*int(ncoord*npart),fileID.read()),(npart,ncoord));
fileID.close()

And I am getting the error

Traceback (most recent call last):
File "transfer_lev_B1.py", line 30, in <module>
coords = np.reshape(struct.unpack('d'*int(ncoord*npart),fileID.read()),(npart,ncoord));
struct.error: unpack requires a string argument of length 56000000

I cant really see where the problem is. The file byte size is 56000000. In a previous attempt with np=1E4 the code worked for a different file with the same format (less total lines). But i have the problem when i go to a larger file with more lines..

ok I solved my problem,

    import struct
    import numpy as np
    import matplotlib.pyplot as plt

    if __name__ == '__main__':

        fileID= open('B1b1_t100000.beam','r');
        npart = 1E6;
        ncoord = 7;
        coords=np.fromfile('B1b1_t100000.beam',dtype=np.float64);
        coords=coords[:(npart*ncoord)];
        coords=np.reshape(coords,(npart,ncoord));
        fileID.close()

    #   Beam 1

        b1_x=coords[:,0];
        b1_y=coords[:,2];
        b1_z=coords[:,4];

        b1_px=coords[:,1];
        b1_py=coords[:,3];
        b1_deltap =coords[:,5];

        beam1=np.array([b1_x,b1_px,b1_y,b1_py,b1_z,b1_deltap,coords[:,6]],np.float64);
        beam1=beam1.T;

     #   Map applied and new coordinates calculated.

        x_mod=np.sqrt(foc)*coords[:,0];
        y_mod=np.sqrt(foc)*coords[:,2];

        px_mod=np.sqrt(defoc)*coords[:,1];
        py_mod=np.sqrt(defoc)*coords[:,3];

        beam1_mod=np.array([x_mod,px_mod,y_mod,py_mod,b1_z,b1_deltap,coords[:,6]],np.float64);
        beam1_mod=beam1_mod.T;

       #---------------Check shape of matrix----------------

#print coords.shape
#    print (beam1_mod).shape
#    print beam1.shape
#    print 'beam1= \n', beam1
#    print 'modified \n', beam1_mod
#----------------------------------------------------


#   New coordinates printed to binary file.

    fileMod=open("B1b1_t100000_mod.beam","w");
    beam1_mod.tofile(fileMod);
    fileMod.close()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM