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
是一个二进制文件读取函数,所以你得到的变量data
是bytes
而不是数字列表。 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
包
我是菜鸟!
我正在使用以下传感器从传感器读取数据:
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
是一个二进制文件读取函数,所以你得到的变量data
是bytes
而不是数字列表。 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
包