Форум сайта python.su
Я новичок на 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
Офлайн
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
Отредактировано (Авг. 5, 2008 00:19:49)
Офлайн
Да действительно запятые не нужны это я их зря воткнул
и потребовалось почемуто не 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.
В чем здесь дело и если имеет место выравнивание по границе слова то как его отключить?
Офлайн
поставь = перед строкой описывающую структуру
unpack('=i25sic', fin.read(34))
Офлайн
Ну вроде все. Всем спасибо.
Офлайн