Python - 将文件内容转换为二进制数组

时间:2017-03-10 09:05:03

标签: python python-2.7

文件内容:

40 13 123
89 123 2223
4  12  0

我需要将整个.txt文件存储为二进制数组,以便稍后将其发送到需要二进制输入的服务器端。

我查看了Python的bytearray文档。  我引用:

  

返回一个新的字节数组。 bytearray类型是0 <= x <0的范围内的可变整数序列。 256.它具有可变序列的大多数常用方法,在可变序列类型中描述,以及字节类型具有的大多数方法,参见字节和字节数组方法。


我的数字大于256,我需要一个bytearray数据结构,用于大于256的数字。

5 个答案:

答案 0 :(得分:8)

您可以使用array / memoryview方法

import array
a = array.array('h', [10, 20, 300]) #assume that the input are short signed integers
memv = memoryview(a)
m = memv.cast('b') #cast to bytes
m.tolist()

然后给出[10, 0, 20, 0, 44, 1]

根据使用情况,人们也可以这样做:

L = array.array('h', [10, 20, 300]).tostring()
list(map(ord, list(L)))

这也给了[10, 0, 20, 0, 44, 1]

答案 1 :(得分:3)

您可以阅读文本文件并将每个'word'转换为int:

with open(the_file, 'r') as f:
    lines = f.read_lines()
    numbers = [int(w) for line in lines for w in line.split()]

然后你必须将numbers打包到一个带struct的二进制数组:

binary_representation = struct.pack("{}i".format(len(numbers)), *numbers)

如果您希望以二进制格式编写这些数据,则必须在打开目标文件时指定:

with open(target_file, 'wb') as f:
   f.write(binary_representation)

答案 2 :(得分:2)

不是bytearray

bytearray documentation开始,它只是一个整数序列,范围为0&lt; = x&lt; 256。

例如,您可以像这样初始化它:

bytearray([40,13,123,89,123,4,12,0])
# bytearray(b'(\r{Y{\x04\x0c\x00')

由于整数已经存储在二进制中,因此您无需转换任何内容。

您的问题现在变成:您想对2223做什么?

>>> bytearray([2223])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: byte must be in range(0, 256)

uint32或int32数组?

要阅读一个文件,您可以使用:

import re
with open('test.txt') as f:
    numbers = [int(w) for line in f for w in re.split(' +', line)]
    print numbers
    #[40, 13, 123, 89, 123, 2223, 4, 12, 0]

获得整数列表后,您可以选择相应的低级Numpy data structure,可能是uint32int32

答案 3 :(得分:1)

我需要这个服务器 - 客户端模块,其中一个功能需要binary输入。可以找到不同的节俭类型here

<强>客户端

myList = [5, 999, 430, 0]
binL = array.array('l', myList).tostring()
# call function with binL as parameter

服务器中,我重新构建了列表

k = list(array.array('l', binL))
print(k)
[5, 999, 430, 0]

答案 4 :(得分:0)

试试这个:

input.txt中:

40 13 123
89 123 2223
4  12  0

解析输出到输出的代码:

with open('input.txt', 'r') as _in:
    nums = map(bin, map(int, _in.read().split())) # read in the whole file, split it into a list of strings, then convert to integer, the convert to binary string

with open('output.txt', 'w') as out:
          out.writelines(map(lambda b: b + '\n', map(lambda n: n.replace('0b', ''), nums))) # remove the `0b` head from the binstrings, then append `\n` to every string in the list, then write to file

output.txt的:

101000
1101
1111011
1011001
1111011
100010101111
100
1100
0

希望它有所帮助。