【问题标题】:How to determine 'word' size in Python如何在 Python 中确定“单词”的大小
【发布时间】:2011-10-18 14:21:32
【问题描述】:

我需要知道 Python 中“单词”中的字节数。我需要这个的原因是我需要从文件中读取的字数;如果我知道一个单词的字节数,我可以使用file.read(num_bytes) 函数从文件中读取适当的字节数。

如何确定一个字的字节数?

【问题讨论】:

  • 定义“单词”。你指的是记忆单位还是语言概念?
  • 我没有指定。我的意思是内存单元,我猜它在 Python 中是未定义的,正如@TokenMacGuy 所说的那样。
  • 一个单词的字节数应该由文件格式决定,而不是Python。您应该查看创建该文件的应用程序。
  • @Jeremy TokenMacGuy 是正确的,Python 中没有标准词。不同的文件/平台会有不同的行为。
  • 然而,“地址大小”有一个定义明确的概念,接受的答案报告了它,但可能与文件中可以找到的数据完全没有关系(除非在/sys/proc 在具有 sysfs/procfs 的 Linux 系统上公开二进制地址值)

标签: python word byte file-read


【解决方案1】:

你可以使用platform.architecture函数:

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

注意同一页的注释:

注意在 Mac OS X(可能还有其他平台)上,可执行文件可能是包含多种架构的通用文件。 要获取当前解释器的“64位”,查询sys.maxsize属性更可靠:

is_64bits = sys.maxsize > 2**32

请记住,这给出了编译 python 解释器的字长。如果python在32位模式下编译,你可以在64位主机上获得32的值。

如果文件由不同的可执行文件生成并且您有权访问此可执行文件,则可以使用platform.architecture 函数的第一个可选参数:

>>> p.architecture('/path/to/executable')
('32bit', '')

【讨论】:

    【解决方案2】:

    Python 中没有“字”的概念,当您从文件中读取二进制数据时,您可以明确说明一次应该读取多少字节。

    就编译器和/或平台而言,“WORD”通常确定基本数据单元的大小。而且 Python 独立于那种东西 :)

    【讨论】:

      【解决方案3】:

      对于单词是什么,并没有真正合理的定义;除了某些架构将某些字节数称为“字”(x86 调用 2 个字节一个字,PPC 调用 4 个字节一个字),但除了这个任意值之外没有太大意义。

      也许最简单的解决方案就是只使用struct 模块;例如,'h' 格式表示有符号短(这与英特尔对“单词”的定义合理地一致)。所以你可以这样做:

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

      【讨论】:

        【解决方案4】:

        我需要知道 Python 中“单词”的字节数。我的原因 需要这是我需要从文件中读取的字数

        然后您需要询问编写文件的人。它与 Python 无关,与实际文件格式有关。顺便说一句,将文件定义为单词序列是很奇怪的。它很可能是一个 16 位或 32 位整数的序列,或者它确实是文本意义上的单词,在这种情况下,您实际上是在扫描文件以查找分隔符之间的标记。

        【讨论】:

          【解决方案5】:

          这样的事情怎么样:

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

          【讨论】:

            【解决方案6】:

            也许以下内容可能是相关且有用的:假设您检查 32 位。看看 (-1)

            【讨论】:

              猜你喜欢
              • 2010-12-24
              • 1970-01-01
              • 1970-01-01
              • 2011-02-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-11-30
              相关资源
              最近更新 更多