Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 4, 2008 22:09:25

pTree
От:
Зарегистрирован: 2008-08-04
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Бинарные файлы

Я новичок на 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, но помоему это не совсем то что нужно. Как я понял он сохраняет и востанавливает ранее сохраненные объекты, но я так и не понял как он их структирует.

Возможно я както слишком усложняю ситуацию, но прошу разяснить мне если не сложно.



Офлайн

#2 Авг. 4, 2008 22:47:43

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Бинарные файлы

посмотри в сторону struct



Офлайн

#3 Авг. 4, 2008 23:11:02

pTree
От:
Зарегистрирован: 2008-08-04
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Бинарные файлы

import stuct

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

что-то типо этого? и далее вместо структыры (как в си) работать с кортежем?
ну вроде устраивает.
Спасибо.



Офлайн

#4 Авг. 5, 2008 00:09:08

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Бинарные файлы

угу. Мой питон 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)

Офлайн

#5 Авг. 5, 2008 09:07:33

pTree
От:
Зарегистрирован: 2008-08-04
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Бинарные файлы

Да действительно запятые не нужны это я их зря воткнул
и потребовалось почемуто не 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.
В чем здесь дело и если имеет место выравнивание по границе слова то как его отключить?



Офлайн

#6 Авг. 5, 2008 09:15:12

evgenyl
От:
Зарегистрирован: 2008-07-22
Сообщения: 148
Репутация: +  0  -
Профиль   Отправить e-mail  

Бинарные файлы

поставь = перед строкой описывающую структуру
unpack('=i25sic', fin.read(34))



Офлайн

#7 Авг. 5, 2008 09:29:20

pTree
От:
Зарегистрирован: 2008-08-04
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Бинарные файлы

Ну вроде все. Всем спасибо.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version