python中文件读取/查找的错误处理

2024-05-08 22:53:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在分析一个二进制文件格式,我希望有一个更好的方法来检查文件的结尾,同时执行读取或查找。基本上,当我对文件f.read(8)时,我想知道返回的字节是否少于8个,而不必检查返回值的长度。类似地,如果我调用f.seek(8,1),我想知道我是否实际上没有查找8字节。我的最佳选择是为这些函数创建包装器吗?在


Tags: 文件方法函数read字节结尾二进制seek
5条回答

检查read()返回的字符串的长度是简单、干净和高效的。Python的所有集合对象(字符串、列表、元组、dict、set等)都将它们的长度存储为一个属性,因此获取长度是一个非常廉价和快速的操作。在

然而,在对数据进行操作之前测试数据是否正确可能是乏味和繁琐的。如果这样的数据几乎总是无效的,那么这些数据几乎总是正确的。这种编码样式称为Look-beforyouleap或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时间。在

试试这个:

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可以替换为变量。我不明白你为什么不比较长度。在

编辑:整件事都在这里。在

相关问题 更多 >