Python从缓冲区读取数据

3

我是一个新手!

我正在使用以下方法从传感器读取数据:

data = ""
dev = os.open("/dev/rtlightsensor0", os.0_RDWR)
data = os.read(dev,16)

print(data)

结果:

b'1 53 -5 1\n'

我认为这是一个字符串,但看起来更像一个缓冲区?有没有人能给我一些提示,如何获得这4个数字?

我已经尝试过:

value1 = data[1]

但结果是不同的数字。

3个回答

2
在阅读其他人的答案后,我必须在这里进行补充。我刚刚意识到你想读取文本文件而不是二进制文件,所以上面的代码对于你的情况不起作用,但我有更好的方法来读取,而不是使用二进制读取。
file = open("/dev/rtlightsensor0", "r")
line = file.readline()
data = [int(each) for each in line.split())

在这里,我将文件作为字符串而不是字节来读取,因为您的文件是文本文件。尝试一下,您会发现它非常简洁。
以下是我的原始答案,如果有一天您需要读取二进制数据,它也可以工作。
我也是新手!
您描述的问题不够清楚,所以我只能猜测您的文件中有4个32位(4字节)int,您想将其读入程序中。
os.read是一个二进制文件读取函数,因此您得到的变量data是bytes而不是数字列表。 Python无法推断出您的数字长度,因为它可以是4个32位数字、1个128位数字或其他某些东西,因此您需要以某种方式明确说明它。
还有一个小问题,您的数据是大端还是小端?如果您的数据不来自网络通信,我认为它是小端的。如果您发现数据错误(例如,不可信地大),则可以尝试将“big”转换为“little”。
因此,您可以像这样完成代码:
dev = os.open("/dev/rtlightsensor0", os.0_RDWR)
raw_data = os.read(dev,16)
data = []
data.append(int.from_bytes(raw_data[0:4], 'little'))
data.append(int.from_bytes(raw_data[4:8], 'little'))
data.append(int.from_bytes(raw_data[8:12], 'little'))
data.append(int.from_bytes(raw_data[12:16], 'little'))
print(data)

不要这样做,因为这真的很愚蠢。如果你能够理解上面的代码,那么你可以更好地编写它,就像这样:
dev = os.open("/dev/rtlightsensor0", os.0_RDWR)
raw_data = os.read(dev, 16)
data = [int.from_bytes(raw_data[i * 4: (i + 1) * 4], 'little') for i in range(4)]
print(data)

顺便说一下,这样读取二进制数据并不明智。一般来说,建议使用 numpy 包。


1

这是一个字节数组。您可以使用 decode 函数将字节数组转换为字符串。

>>> test = b'1 53 -5 1\n'
>>> type(test)
<class 'bytes'>
>>> test[0]
49
>>> test_1 = test.decode("utf-8")
>>> test_1[0]
'1'

0

你可以使用列表推导式获取整数:

[int(x) for x in b'1 53 -5 1\n'.decode().split(' ')] 
# [1, 53, -5, 1] 

非常感谢,你的方法比我的快多了! :) - ser co

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接