Как определить размер слова в Python

Мне нужно знать количество байтов в «слове» в Python. Причина, по которой мне это нужно, заключается в том, что у меня есть количество слов, которые мне нужно прочитать из файла; если бы я знал количество байтов в слове, я мог бы использовать функцию file.read(num_bytes) для чтения нужного количества из файла.

Как определить количество байтов в слове?


person jlconlin    schedule 02.08.2011    source источник
comment
Дайте определение слову. Вы имеете в виду единицу памяти или лингвистическую концепцию?   -  person Rafe Kettler    schedule 03.08.2011
comment
Я не уточнил. Я имел в виду единицу памяти, которая, я полагаю, не определена в Python, как утверждает @TokenMacGuy.   -  person jlconlin    schedule 03.08.2011
comment
Количество байтов в слове должно определяться форматом файла, а не Python. Вам следует посмотреть на приложение, создавшее файл.   -  person Mark Ransom    schedule 03.08.2011
comment
@Jeremy TokenMacGuy правильный, в Python нет стандартного слова. Различные файлы / платформы будут вести себя по-разному.   -  person Rafe Kettler    schedule 03.08.2011
comment
Однако существует четко определенная концепция размера адреса, о которой сообщает принятый ответ, но, вероятно, не имеет никакого отношения к данным, которые можно найти в файле (если только что-то в /sys или /proc в системах Linux с sysfs / procfs предоставляет значения двоичного адреса)   -  person SingleNegationElimination    schedule 03.08.2011


Ответы (6)


Вы можете использовать функцию platform.architecture:

>>> import platform
>>> platform.architecture()
('64bit', '')

Обратите внимание на примечание на той же странице:

Примечание. В Mac OS X (и, возможно, на других платформах) исполняемые файлы могут быть универсальными файлами, содержащими несколько архитектур. Чтобы получить «64-битность» текущего интерпретатора, более надежно запросить атрибут sys.maxsize:

is_64bits = sys.maxsize > 2**32

Имейте в виду, что это дает размер слова, с которым был скомпилирован интерпретатор python. Вы можете получить значение 32 на 64-битном хосте, если бы python был скомпилирован в 32-битном режиме.

Если файл создается другим исполняемым файлом и у вас есть доступ к этому исполняемому файлу, вы можете использовать первый необязательный аргумент функции platform.architecture:

>>> p.architecture('/path/to/executable')
('32bit', '')
person GaretJax    schedule 02.08.2011

В Python нет понятия «слово», когда вы читаете двоичные данные из файла, вы можете явно указать, сколько байтов следует читать за раз.

С точки зрения компилятора и / или платформы «WORD» обычно определяет размер базовой единицы данных. И Python не зависит от подобных вещей :)

person Zaur Nasibov    schedule 02.08.2011

Нет действительно правильного определения того, что такое слово; за исключением того, что некоторые архитектуры называют некоторое количество байтов словом (x86 вызывает 2 байта на слово, PPC вызывает 4 байта на слово), но кроме этого произвольного значения особого значения нет.

Возможно, самое простое решение - просто обратиться к модулю struct; например, формат 'h' означает короткое со знаком (что разумно согласуется с определением слова «слово» Intel). Итак, вы могли сделать это:

>>> import struct
>>> f = file('.vimrc')
>>> struct.unpack('h', f.read(struct.calcsize('h')))
(8226,)
>>> 
person SingleNegationElimination    schedule 02.08.2011

Мне нужно знать количество байтов в «слове» в Python. Причина, по которой мне это нужно, заключается в том, что у меня есть количество слов, которые мне нужно прочитать из файла

Затем вам нужно спросить человека, который написал файл. Это не имеет ничего общего с Python и все, что связано с фактическим форматом файла. Довольно странно, чтобы файл определялся как последовательность слов BTW. Скорее всего, это последовательность 16- или 32-битных целых чисел, или же это действительно слова в текстовом смысле, и в этом случае вы действительно сканируете файл на предмет наличия токенов между разделителями.

person user207421    schedule 03.08.2011

Как насчет чего-то вроде этого:

def machine_word_size():
    import sys
    num_bytes = 0
    maxint = sys.maxint
    while maxint > 0:
        maxint = maxint >> 8
        num_bytes += 1
    return num_bytes
person Sri    schedule 17.04.2013

Возможно, уместным и полезным может оказаться следующее: Предположим, вы проверяете 32-битность. Посмотрите, вернется ли (-1) ‹< 31 так долго или нет. Для 32-битной версии нет, в то время как (-1) ‹AC32 и 1 ‹› 31 - нет.

person David Vanderschel    schedule 21.05.2017