0

我希望检查在点(x、y、z 等)的文本文件中是否是标题(True)不是(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 
4

2 回答 2

2

纯文本文件实际上并没有传统意义上的标题。这只是一个字符流。

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

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

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

于 2013-03-27T22:45:07.243 回答
2

如果您可以将列命名为“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 的文件位于 OS 磁盘缓存中,或者 39.7ms 与 39.7ms 用于远程驱动器上的文件。即使在最好的情况下,从文件中读取块到缓冲区的 I/O 成本也会超过处理它的成本(包括 中的额外处理readline和代码中的额外处理)。

于 2013-03-27T22:54:09.140 回答