Python中的内置函数,用于检查文本文件中的头文件



我希望检查是否在点(x,y,z等)的文本文件中有头(True)not (False)。我想知道Python中是否有内置函数或更好的方法尊重我自己的函数。

def check_header(filename, parse):
    with open(filename) as f:
        first = f.readline()
        line = first.rstrip().split(parse)
        try:
            float(line[0])
            return False
        except ValueError:
            return True
我写了这个函数示例
a b c d
449628.46 6244026.59 0.47 1
449628.55 6244033.12 0.30 2 
449628.75 6244046.31 0.37 3 
449628.81 6244049.63 0.44 1 
449628.81 6244049.88 0.39 5 
449628.81 6244050.66 0.30 1 
449628.96 6244060.67 0.38 2 
449629.18 6244075.61 0.39 2 
449629.24 6244078.72 0.47 4 
449629.24 6244078.96 0.41 8 
449629.23 6244079.19 0.34 4 
check_header(filename, " ")
True
449628.46 6244026.59 0.47 1
449628.55 6244033.12 0.30 2 
449628.75 6244046.31 0.37 3 
449628.81 6244049.63 0.44 1 
449628.81 6244049.88 0.39 5 
449628.81 6244050.66 0.30 1 
449628.96 6244060.67 0.38 2 
449629.18 6244075.61 0.39 2 
449629.24 6244078.72 0.47 4 
449629.24 6244078.96 0.41 8 
449629.23 6244079.19 0.34 4
check_header(filename, " ")
False 

如果你可以有列命名,例如"3.5",你的代码显然不会工作,所以我假设你不能。

这意味着整个事情有点过于复杂了。实际上,您所需要做的就是查看第一个字符是否是浮点数的有效起始字符:

def check_header(filename):
    with open(filename) as f:
        first = f.read(1)
    return first not in '.-0123456789'

对于空文件,这将返回True而不是引发异常,但除此之外,它应该与原始代码完全相同的用例工作。

我通常不会提到这一点,但既然你给你的问题贴上了"优化"的标签,我猜你很关心:这段代码理论上比你的代码快,原因应该很明显,但在现实生活中,它几乎总是没有区别。根据我机器上的%timeit, read/readline之后的部分需要244ns而不是2.6us。这比你想象的要快10倍多。但是read/readline部分在操作系统磁盘缓存中的文件需要13.1us和13.2us,或者在远程驱动器上的文件需要39.7ms和39.7ms。从文件中读取一个块到缓冲区的I/O成本,即使在最好的情况下,也超过了处理它的成本(readline中的额外处理和代码中的额外处理)。

明文文件实际上没有传统意义上的头。它只是一串字符。

如果这是一个二进制格式,你可以有一个严格的头,任何读者都必须遵守这种格式。我假设这是您已经创建的自定义格式,如果是这样的话,您已经有了一个很好的解决方案。

如果您想了解更多关于标头的信息,您应该查看JPEG标头规范,它很简单。
http://www.fastgraph.com/help/jpeg_header_format.html

请参阅这篇文章,以获取读取二进制jpeg头文件的python代码示例。
Python:检查上传的文件是否为jpg

最新更新