达到EOF与使用解包之间的冲突

时间:2016-03-02 18:29:49

标签: python python-2.7

我的错误是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()

1 个答案:

答案 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()