Python 从缓冲区读取数据

Python read data from Buffer

我是菜鸟!

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

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]

但结果是不同的数字..

它是一个字节数组。您可以使用 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'

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

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

看完别人的回答,我必须在这里补充一下。

我刚发现你想读取文本文件而不是二进制文件,所以上面的代码不适合你的情况,但我有更好的读取方式而不是使用二进制读取。

file = open("/dev/rtlightsensor0", "r")
line = file.readline()
data = [int(each) for each in line.split())

这里我读取的文件是字符串而不是字节,因为你的文件是文本文件。试试看,你会发现它真的很简洁。

下面是我的原答案,如果有一天你需要读取二进制数据,它会起作用。

我也是菜鸟!

你没有足够清楚地描述你的问题,所以我只能猜测你的文件中有 4 个 32 位(4 字节)int,你想将其读入你的程序。

os.read是一个二进制文件读取函数,所以你得到的变量databytes而不是数字列表。 Python 无法推断您的数字的长度,因为它可以是 4 个 32 位数字或 1 128 位数字或其他内容,因此您需要通过某种方式明确说明。

还有一个小问题,你的数据是big endian还是little endian?如果您的数据不是来自网络通信,我想它是小端。如果您发现数据有误(例如,大到难以置信),您可以尝试将 '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