【问题标题】:Python: Converting a Text File to a Binary FilePython:将文本文件转换为二进制文件
【发布时间】:2020-03-14 22:02:13
【问题描述】:

我们可以将任何数字文件转换成二进制文件。

我有一个 1MB 的文本文件,

我想将其转换为二进制字符串,并将输出视为二进制数,反之亦然,

换句话说,如果我有二进制数,我想将其转换为文本文件。

我如何在 Python 中做到这一点?有标准的方法吗?

现在这个论坛有一些帖子(1,2,3, 4 ) 对此,但他们都没有正确回答我的问题。

【问题讨论】:

  • 这能回答你的问题吗? Python read text file as binary?
  • @NorthernSage 我看不到“如果我有二进制数,我想将其转换为文本文件”。
  • 嗯,二进制文件和文本文件都包含一系列位,文本文件中的位代表字符,而二进制文件中的位代表自定义数据。所以最后,一切都是二进制的,重要的是你如何在脚本中解释这些数据。将“二进​​制数转换为文本文件”有点令人困惑。是否要将数字的二进制表示形式以字符串格式保存在文本文件中?请举例说明您要转换成什么格式。
  • 问题似乎有效;只是应该用不同的措辞,这样对于会回答它的技术人员来说是可以理解的。

标签: python binaryfiles binary-data


【解决方案1】:

这里提到的“文本文件”似乎是指 ASCII 文件。 (其中每个字符占用 8 位空间)。

第二行“将其转换为二进制字符串”可能表示文本文件的 ASCII 表示,给出一个字节序列“作为二进制数输出”(类似于加密前text is converted to a number 的公钥加密),例如.

text = 'ABC '
for x in text:
  print(format(ord(x), '08b'), end='')

将给出二进制(数字)字符串:01000001010000100100001100100000
十进制为:1094861600

第三行意味着(字节)对二进制数进行排序并显示等效的 ASCII 字符(对于每个 8 位序列),例如。 0x41 替换为 'A'(作为输出)(这里的假设是每个数字都将映射到可打印的 ASCII 即文本字符,并且给定的二进制数具有 8 位的倍数)。

例如。反转(将二进制数转换为文本):

binary = "01000001010000100100001100100001"
#number of characters in text
num = len(binary)/8 

for x in range(int(num)):
  start = x*8
  end = (x+1)*8
  print (chr(int(str(binary[start:end]),2)), end='')
print()

会给出文本:ABC!

对于 1MB 的文本文件,您可以将文本字符串拆分为您的机器可以处理的块,例如。 32 位(转换前)

Python IDE测试

【讨论】:

    【解决方案2】:

    有关标准字符串编码的列表,请参阅https://docs.python.org/3/library/codecs.html#standard-encodings,因为转换取决于编码。

    这些函数将有助于在字节/整数和字符串之间进行转换,默认为 UTF-8。

    提供的示例使用 UTF-8 中的韩文字符“한”。

    
    def bytes_to_string(byte_or_int_value, encoding='utf-8') -> str:
        if isinstance(byte_or_int_value, bytes):
            return byte_or_int_value.decode(encoding)
        if isinstance(byte_or_int_value, int):
            return chr(byte_or_int_value).encode(encoding).decode(encoding)
        else: 
            raise ValueError('Error: Input must be a bytes or int type')
    
    def string_to_bytes(string_value, encoding='utf-8') -> bytes:
        if isinstance(string_value, str):
            return bytes(string_value.encode(encoding))
        else: 
            raise ValueError('Error: Input must be a string type')
    
    int_value = 54620
    bytes_value = b'\xED\x95\x9C'
    string_value = '한'
    
    assert bytes_to_string(int_value) == string_value
    assert bytes_to_string(bytes_value) == string_value
    assert string_to_bytes(string_value) == bytes_value
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 2014-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多