2014-12-15 2 views
0

Привет У меня возникли проблемы с использованием в питона поместить значение,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() 

И я получаю ошибку

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 

Я не могу реально увидеть, где проблема. Размер байта файла - 56000000. В предыдущей попытке с np = 1E4 код работал для другого файла с тем же самым форматом (меньше общих строк). Но у меня есть проблема, когда я иду в большой файл с большим количеством строк ..

+1

Wild догадки: попробуйте открыть файл в двоичном режиме. 'fileID = open ('B1b1_t100000.beam', 'rb');' – Kevin

+0

Также, что представляют ncoord и npart? «npart» ncoord' должен равняться размеру файла? Потому что сейчас он равен 7 000 000, когда файл намного больше 56 000 000. – Kevin

+0

Нет. Все равно получите ту же ошибку:/ – mattskatefreak

ответ

0

ок я решил мою проблему,

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() 
Смежные вопросы