gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 04:54:57 26 4
gpt4 key购买 nike

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

最佳答案

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

但是,在操作数据之前测试数据是否正确可能是乏味且麻烦的。如果数据几乎总是正确的,那么这样的测试效率就会很低。这种编码风格称为“三思而后行”或 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 时间。

关于python - python 中文件读取/查找的错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27651836/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com