我正在解析二进制文件格式,我想要一种更好的方法来在执行读取或搜索时检查文件的结尾。基本上,当我对文件f执行f.read(8)时,我想知道是否返回少于8个字节而不必检查返回值的长度。同样,如果我调用f.seek(8,1),我想知道我是否实际上没有寻找8个字节。我最好为这些功能创建包装器吗?
答案 0 :(得分:3)
检查read()
返回的字符串的长度是简单,干净和高效的。所有Python的集合对象(字符串,列表,元组,字符串,集合等)都将它们的长度存储为属性,因此获取长度是一种非常便宜且快速的操作。
但是,在操作之前测试数据是否正确可能会非常繁琐且繁琐。如果数据几乎总是正确的,那么这种测试效率很低。这种编码风格称为Look Before You Leap或LBYL。相比之下,Python中流行的编码风格是宽松而不是权限或EAFP。换句话说,不是测试数据然后决定如何继续,而是假设数据是正确的,并在出现问题时引发异常。
EAFP代码通常比LBYL代码更容易实现,读取和维护。在Python中try: ... except
非常有效,并且通常比等效的if: ... else:
代码更快,因此鼓励使用异常。请参阅Python syntax and semantics上的维基百科文章。
因此,在尝试解压缩数据之前,不是测试数据的长度是正确的,而是可以将所有struct.unpack()
调用放入try: ... except struct.error
块,并在引发异常时进行挽救。这种方法意味着您无需担心每个seek()
或read()
来电是否会超过文件末尾。
如果您确实想坚持使用LBYL方法,那么可以为seek()
编写一个包装器,但它不会非常有效,因为它并不简单告诉你是否寻找文件末尾的方法。因此,这样的包装器会为每个seek()
调用增加额外的开销,如果大多数调用都不会超过文件的末尾,则会浪费CPU时间。
答案 1 :(得分:-1)
试试这个:
f = open("some.txt", "rw+")
str1 = f.read(8)
for num in range(1,9):
f.seek(0,0)
str2 = f.read(8-num)
if str1 == str2:
print 'file is less than 8'
break
f.close()
8可以用变量替换。我不明白为什么你不会比较长度。
编辑:这是整个事情。