我希望检查是否在点(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