Найти - Пользователи
Полная версия: Бинарные файлы
Начало » Python для экспертов » Бинарные файлы
1
pTree
Я новичок на Python и вопрос возможно глупый, но всеже попробую задать…
У меня есть строго структуированный файл. Выглядит это примерно так
число - 4 байта
текст - 25 байт
число - 4 байта
символ - 1 байт
Мне нужно прочитать его.
На Си я бы сделал это так

struct cData cdata;

fin = fopen(“file.dat”, “r”);
fread(&cdata, sizeof(cData), 1, fin)

здесь структура cData описывает все четыре поля.
Вопрос в том как подобное мне сделать на Python?

Я пробовал использовать
fin = open(“file.dat”, “rb”)
fin.read(нужное_количество_байт)
такая конструкция возвращает строку которую потом приходится дополнительно обрабатывать,
так же смотрел в сторону pickle, но помоему это не совсем то что нужно. Как я понял он сохраняет и востанавливает ранее сохраненные объекты, но я так и не понял как он их структирует.

Возможно я както слишком усложняю ситуацию, но прошу разяснить мне если не сложно.
Андрей Светлов
посмотри в сторону struct
pTree
import stuct

fin = open(“file.dat”, “rb”)
tuple = struct.unpack('i, 25s, i, c', fin.read(34))

что-то типо этого? и далее вместо структыры (как в си) работать с кортежем?
ну вроде устраивает.
Спасибо.
Андрей Светлов
угу. Мой питон 2.5 не позволяет писать ‘i, 25s, i, c’ вместо ‘i 25s i c’. Т.е. запятая - не whitespace. На чем пробовал?
В новом есть еще namedtuple - преобразуешь в нее, будет совсем как структура. Я ее и к 2.5 быстро прикрутил - удобно.

Да, и не называй переменный так же, как имена в модуле __builtins__ - т.е. tuple, list, file, str, min, max и т.д. Затрешь стандартную функцию/класс в твоем модуле. И потом можешь поймать странную ошибку. Например,

>>> tuple = struct.unpack('i 25s i c', ' '*37)
>>> tuple(23,)
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
TypeError: 'tuple' object is not callable
pTree
Да действительно запятые не нужны это я их зря воткнул
и потребовалось почемуто не 34 а 37 байт. Похоже либо я не правильно определил размеры в байтах когда описывал строку формата либо имеет место выравнивание по границе слова.
Символ Тип языка C
x — (пустой байт)
c char
b signed char
B unsigned char
h short int
H unsigned short int
i int
I unsigned int
l long int
L unsigned long
f float
d double
s char
p char
P void *

если я правильно понимаю то “i” = 4 байта, “25s” = 25 байт, “c” = 1 байт. Итого 4+25+4+1=34, а требуется 37.
В чем здесь дело и если имеет место выравнивание по границе слова то как его отключить?
evgenyl
поставь = перед строкой описывающую структуру
unpack('=i25sic', fin.read(34))
pTree
Ну вроде все. Всем спасибо.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB