Найти - Пользователи
Полная версия: Перевести набор байтов в строку.
Начало » Python для новичков » Перевести набор байтов в строку.
1
Pluto
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 что-нибудь есть для конвертации последовательности байтов в десятичные числа?
py.user.next
>>> 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'
>>>
но тогда будет исключение, если там всё заполнено и нулей нет.
Pluto
Как-то странно. Неужели нету какого-то более простого способа.
Я когда-то давненько писал программу на visual basic, читающую dbf-файл. Как-то я там спокойно получал имена полей или другие текстовые данные из бинарного файла.
Shaman
Pluto
Как-то странно. Неужели нету какого-то более простого способа.Я когда-то давненько писал программу на visual basic, читающую dbf-файл. Как-то я там спокойно получал имена полей или другие текстовые данные из бинарного файла.
Тогда отложите изобретение велосипеда в сторону и воспользуйтесь одной из готовых библиотек работы с dbf.
py.user.next
pypi. dbf
Pluto
Shaman
Тогда отложите изобретение велосипеда в сторону и воспользуйтесь одной из готовых библиотек работы с dbf.
Дык, нету для третьего питона готовых библиотек-то. Ну, нету.
Есть pyodbc, но у меня с ней проблема из-за стороннего программного обеспечения. Как-то оно с pyodbc не дружит. Вдобавок, pyodbc не позволяет создавать поля типа Numeric нужной длины и точности после запятой. Она их создаёт только максимальной длины.
Pluto
py.user.next
pypi. dbf
Вроде, самый первый модуль таки и для третьего питона подходит. Попробуем.

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