python中文件读/写的错误处理

时间:2014-12-26 00:33:07

标签: python

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

2 个答案:

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

编辑:这是整个事情。