Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 4, 2015 15:25:19

Pluto
Зарегистрирован: 2012-05-29
Сообщения: 177
Репутация: +  2  -
Профиль   Отправить e-mail  

Перевести набор байтов в строку.

file = open("myfile", "rb")
file.seek(4, 0) #смещение тут указано условно (т.е. не соответствует действительности)
data = file.read(10) # считываем имя поля. Внутри dbf-файла для него отводится 10 байт
strdata = str("data", encoding = "cp866")
print (strdata)

Считывание идёт из dbf-файла с dos-кодировкой
1. Правильно ли я указываю encoding?
2. strdata получается, например, такая: “FAM\x00\x00\x00\x00\x00\x00\x00”
Надо получить просто “FAM”
Это имя одного из полей. Максимальная длина его 10-байт (символов). Поэтому столько и считываю. Заранее знать сколько там символов в имени поля я не могу. Как избавиться от этих х00?

3. Кроме модуля struct что-нибудь есть для конвертации последовательности байтов в десятичные числа?

Офлайн

#2 Апрель 5, 2015 00:06:04

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10031
Репутация: +  857  -
Профиль   Отправить e-mail  

Перевести набор байтов в строку.

>>> b = b'FAM\x00\x00\x00\x00\x00\x00\x00'
>>> b
b'FAM\x00\x00\x00\x00\x00\x00\x00'
>>> b.partition(b'\x00')
(b'FAM', b'\x00', b'\x00\x00\x00\x00\x00\x00')
>>> 
>>> b.partition(b'\x00')[0].decode('latin1')
'FAM'
>>>

Можно и так
>>> b = b'FAM\x00\x00\x00\x00\x00\x00\x00'
>>> b
b'FAM\x00\x00\x00\x00\x00\x00\x00'
>>> b[:b.index(b'\x00')]
b'FAM'
>>> b[:b.index(b'\x00')].decode('latin1')
'FAM'
>>>
но тогда будет исключение, если там всё заполнено и нулей нет.



Отредактировано py.user.next (Апрель 5, 2015 00:09:52)

Офлайн

#3 Апрель 5, 2015 08:54:22

Pluto
Зарегистрирован: 2012-05-29
Сообщения: 177
Репутация: +  2  -
Профиль   Отправить e-mail  

Перевести набор байтов в строку.

Как-то странно. Неужели нету какого-то более простого способа.
Я когда-то давненько писал программу на visual basic, читающую dbf-файл. Как-то я там спокойно получал имена полей или другие текстовые данные из бинарного файла.

Офлайн

#4 Апрель 5, 2015 09:24:47

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Перевести набор байтов в строку.

Pluto
Как-то странно. Неужели нету какого-то более простого способа.Я когда-то давненько писал программу на visual basic, читающую dbf-файл. Как-то я там спокойно получал имена полей или другие текстовые данные из бинарного файла.
Тогда отложите изобретение велосипеда в сторону и воспользуйтесь одной из готовых библиотек работы с dbf.

Офлайн

#5 Апрель 5, 2015 10:10:43

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10031
Репутация: +  857  -
Профиль   Отправить e-mail  

Перевести набор байтов в строку.

Офлайн

#6 Апрель 5, 2015 21:16:07

Pluto
Зарегистрирован: 2012-05-29
Сообщения: 177
Репутация: +  2  -
Профиль   Отправить e-mail  

Перевести набор байтов в строку.

Shaman
Тогда отложите изобретение велосипеда в сторону и воспользуйтесь одной из готовых библиотек работы с dbf.
Дык, нету для третьего питона готовых библиотек-то. Ну, нету.
Есть pyodbc, но у меня с ней проблема из-за стороннего программного обеспечения. Как-то оно с pyodbc не дружит. Вдобавок, pyodbc не позволяет создавать поля типа Numeric нужной длины и точности после запятой. Она их создаёт только максимальной длины.

Отредактировано Pluto (Апрель 5, 2015 21:17:07)

Офлайн

#7 Апрель 5, 2015 21:23:44

Pluto
Зарегистрирован: 2012-05-29
Сообщения: 177
Репутация: +  2  -
Профиль   Отправить e-mail  

Перевести набор байтов в строку.

py.user.next
pypi. dbf
Вроде, самый первый модуль таки и для третьего питона подходит. Попробуем.

П.С. Но, всё равно, мой вопрос остаётся актуальным. С бинарным файлом-то тоже нужно уметь работать.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version