我的错误是unpack需要一个长度为1的字符串参数,但是当脚本到达文件末尾时,脚本不会返回这样的参数。如何在将二进制数据转换为int数据的同时仍然到达文件的末尾,而不会弹出该错误?
ecgSS = []
ecgFB = []
try:
print("Beginning snipping of ECG data from the holter file...")
#Get size of file in bytes
file_size = os.path.getsize(args.filename)
#Read holter file into memory
holter = open(args.filename, 'rb')
ecgCount = 0
while ecgCount <= file_size:
packetID = struct.unpack('B', holter.read(1))[0]
packetSS = struct.unpack('H', holter.read(2))[0]
packetFB = struct.unpack('H', holter.read(2))[0]
if(packetID == 0):
ecgCount += 1
ecgSS.append(packetSS)
ecgFB.append(packetFB)
#Close the file stream
holter.close()
答案 0 :(得分:1)
在阅读之前,您必须确保文件有足够的数据。对于while循环的每次迭代,您正在读取5个字节,因此您必须确保在读取之前至少有5个字节。此外,每次读取后计数必须增加5。
一个简单的修复方法是将循环更改为
while ecgCount < file_size/5:
使用该修复程序,您还需要使用两个计数器。一个用于文件中的数据,一个用于文件中的有效数据。如我所见,您似乎只考虑packetID==0
这种验证类型的数据。你需要一个不同的柜台。假设validCount,您的程序将如下所示:
ecgSS = []
ecgFB = []
try:
print("Beginning snipping of ECG data from the holter file...")
#Get size of file in bytes
file_size = os.path.getsize(args.filename)
#Read holter file into memory
holter = open(args.filename, 'rb')
ecgCount = 0
validCount = 0
while ecgCount < file_size/5:
packetID = struct.unpack('B', holter.read(1))[0]
packetSS = struct.unpack('H', holter.read(2))[0]
packetFB = struct.unpack('H', holter.read(2))[0]
ecgCount += 1
if(packetID == 0):
validCount += 1
ecgSS.append(packetSS)
ecgFB.append(packetFB)
#Close the file stream
holter.close()