2015-08-03 2 views
0

Итак, у меня есть двоичный файл, который я читаю с помощью python, и я проверяю результаты с помощью matlab.Struct.unpack двоичный файл как проблема uint16, чтение python меньше чисел, чем ожидалось

#Constants 
RecordsPerBuffer = 10 
RecordLength = 9920 
Records = 1000 
Channels = 2 

SamplesPerAline = Channels*RecordLength*RecordsPerBuffer 
AlinesPerBscan = Records/RecordsPerBuffer 
onearm='RawSpectraBgn.dat' 
with open(onearm, "rb") as f: 
    fileContent = f.read() 
    print(type(fileContent)), "FileContentType" 
    print(len(fileContent)), "FileContentLenght", len(fileContent)*1./10 
    for j in range (0, AlinesPerBscan): 
     for i in range (0, SamplesPerAline): 
       back[i,j]=struct.unpack_from('!H',fileContent[(j*SamplesPerAline+i*2):(j*SamplesPerAline+i*2+2)])[0] 
     #print back.shape 

Поэтому у меня есть массив с AlinesPerBscan строк и столбцов AlinesPerBscan, и я сюжет строки в Python и MATLAB. В то время как в Matlab каждая строка выглядит одинаково, на графике python выглядит точно так же, как и в matlab, за исключением того факта, что каждая строка начинается примерно на 2 часа пунктов раньше и заканчивается раньше, поэтому в конце каждой строки начинается новая строка. Удивительно, что данные не заканчиваются, хотя длина двоичных данных соответствует количеству элементов в массивах. Я потратил уже несколько дней на то, чтобы выяснить это, пожалуйста, помогите!

+0

Почему вы используете 'struct' вместо' numpy.fromfile'? То, что вы делаете, это одна строка кода, использующая 'numpy.fromfile'. – TheBlackCat

ответ

1

Вы увеличиваете число j на количество записей, а не общий размер, если эти записи. Предполагая, что производительность не является проблемой, гораздо проще читать два байта по требованию, а не пытаться самостоятельно имитировать указатель на файл.

with open(onearm, "rb") as f: 
    fileContent = f.read() 
    print(type(fileContent)), "FileContentType" 
    print(len(fileContent)), "FileContentLenght", len(fileContent)*1./10 
    for j in range (0, AlinesPerBscan): 
     for i in range (0, SamplesPerAline): 
      back[i,j] = struct.unpack("!H", f.read(2))[0] 

Хотя f.read(2) возвращает только два байта, существует множество буферов, участвующих, которые мешают вам на самом деле доступ к файловой системе один раз за вызов.

Смежные вопросы