文件上的 Python3 struct pack 出现问题
Trouble with Python3 struct pack on a file
我有一些数据
'BBB', 175, 115, 67
如果我像这样将这些数据放入命令中:
from struct import pack; open("/home/pi/testfile4", "wb").write(pack("BBB", 175, 115, 67))
它 运行 很好,产生了我期望的结果。
现在,如果我使用 nano 和 运行 将以下命令将该信息放入纯文本文件中:
bin_data = open('/home/pi/file', 'rb').read()
from struct import pack; open("/home/pi/testfile4", "wb").write(pack(bin_data))
我收到以下错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
struct.error: bad char in struct format
如果我在文件的读取命令中有'rb'也没关系。无论有没有它都会产生相同的错误。
在 Python 方面,我是一个相对的新手,所以除了我正在尝试的方式之外,我不知道该怎么做。我尝试了 bytearray
但它没有以我预期的格式生成结果。
我在 Raspberry Pi 和 Python 3.7.3 以及 Mac 和 Python 3.8.2 上尝试过这个,他们都想出了相同的方法错误。
我到底哪里做错了,还有其他方法可以产生相同的结果吗?
如果您想知道我到底在做什么,我正在将数据转换为 Twinkly 圣诞灯可以接受的格式。这样三个字节的数据就是用RGB颜色给单个灯着色。一个 56 灯串需要一个 168 字节的文件用于单个帧。我试图在同一个文件中发送 24 帧,所以这是很多文本,Python 似乎不想在一个命令中处理那么多数据,至少来自解释器。
谢谢!
首先,您要传递 pack()
格式字符串 BBB
和 3 个 int
,每个都可以存储在 unsigned char
中:
pack("BBB", 175, 115, 67)
在第二种情况下,你只是传递了pack()
一个str
(从文件中读取的内容,是'BBB', 175, 115, 67
),它假定它是格式字符串。
请务必阅读 documentation。
你可能想做这样的事情:
from struct import pack
with open("/home/pi/lights.txt") as colours_text_file:
with open("/home/pi/lights.bin", "wb") as colours_bin_file:
for line in colours_text_file:
red, green, blue = map(int, line.rstrip().split(", "))
colours_bin_file.write(pack("BBB", red, green, blue))
其中 /home/pi/lights.txt
是一个文本文件,内容如下:
175, 115, 67
175, 105, 67
175, 95, 67
175, 85, 67
175, 75, 67
175, 65, 67
它一行一行地读取,并将str
转换为3 int
s。
然后将3个int
打包为unsigned char
写入/home/pi/lights.bin
.
我有一些数据
'BBB', 175, 115, 67
如果我像这样将这些数据放入命令中:
from struct import pack; open("/home/pi/testfile4", "wb").write(pack("BBB", 175, 115, 67))
它 运行 很好,产生了我期望的结果。
现在,如果我使用 nano 和 运行 将以下命令将该信息放入纯文本文件中:
bin_data = open('/home/pi/file', 'rb').read()
from struct import pack; open("/home/pi/testfile4", "wb").write(pack(bin_data))
我收到以下错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
struct.error: bad char in struct format
如果我在文件的读取命令中有'rb'也没关系。无论有没有它都会产生相同的错误。
在 Python 方面,我是一个相对的新手,所以除了我正在尝试的方式之外,我不知道该怎么做。我尝试了 bytearray
但它没有以我预期的格式生成结果。
我在 Raspberry Pi 和 Python 3.7.3 以及 Mac 和 Python 3.8.2 上尝试过这个,他们都想出了相同的方法错误。
我到底哪里做错了,还有其他方法可以产生相同的结果吗?
如果您想知道我到底在做什么,我正在将数据转换为 Twinkly 圣诞灯可以接受的格式。这样三个字节的数据就是用RGB颜色给单个灯着色。一个 56 灯串需要一个 168 字节的文件用于单个帧。我试图在同一个文件中发送 24 帧,所以这是很多文本,Python 似乎不想在一个命令中处理那么多数据,至少来自解释器。
谢谢!
首先,您要传递 pack()
格式字符串 BBB
和 3 个 int
,每个都可以存储在 unsigned char
中:
pack("BBB", 175, 115, 67)
在第二种情况下,你只是传递了pack()
一个str
(从文件中读取的内容,是'BBB', 175, 115, 67
),它假定它是格式字符串。
请务必阅读 documentation。
你可能想做这样的事情:
from struct import pack
with open("/home/pi/lights.txt") as colours_text_file:
with open("/home/pi/lights.bin", "wb") as colours_bin_file:
for line in colours_text_file:
red, green, blue = map(int, line.rstrip().split(", "))
colours_bin_file.write(pack("BBB", red, green, blue))
其中 /home/pi/lights.txt
是一个文本文件,内容如下:
175, 115, 67
175, 105, 67
175, 95, 67
175, 85, 67
175, 75, 67
175, 65, 67
它一行一行地读取,并将str
转换为3 int
s。
然后将3个int
打包为unsigned char
写入/home/pi/lights.bin
.