文件内容:
40 13 123
89 123 2223
4 12 0
我需要将整个.txt
文件存储为二进制数组,以便稍后将其发送到需要二进制输入的服务器端。
我查看了Python的bytearray文档。
我引用:
返回一个新的字节数组。 bytearray类型是0 <= x <0的范围内的可变整数序列。 256.它具有可变序列的大多数常用方法,在可变序列类型中描述,以及字节类型具有的大多数方法,参见字节和字节数组方法。
我的数字大于256,我需要一个bytearray数据结构,用于大于256的数字。
答案 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
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)
要阅读一个文件,您可以使用:
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,可能是uint32
或int32
。
答案 3 :(得分:1)
我需要这个thrift服务器 - 客户端模块,其中一个功能需要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
希望它有所帮助。