Python中的内置函数用于检查文本文件中的标题
Posted
技术标签:
【中文标题】Python中的内置函数用于检查文本文件中的标题【英文标题】:built-in function in Python to check Header in a Text file 【发布时间】:2013-03-18 05:41:24 【问题描述】:我希望检查在点(x、y、z 等)的文本文件中是否有 标题 (True) 或 不是(错误)。我想知道 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
【问题讨论】:
旁注:您的格式是 CSV 方言,可以使用 stdlib 中的 [csv
][1] 模块进行读写(您只需传递 delimiter=' '
),这可能比您正在执行的任何自定义代码更简单、更健壮。您可能需要考虑切换到逗号作为分隔符而不是空格(例如,这将使添加带有空格的列名变得微不足道,而无需处理引用)。
另外,为什么这被标记为“优化”?你真的需要这个检查来加快速度,还是你说的这个词有别的意思?
【参考方案1】:
如果您可以将列命名为“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
中的额外处理和代码中的额外处理)。
【讨论】:
感谢 abernert 非常专业,我喜欢你的建议【参考方案2】:纯文本文件实际上没有传统意义上的标题。这只是一个字符流。
如果这是一种二进制格式,您可以有一个严格的标题,并且任何阅读器都必须遵守该格式。我假设这是您创建的自定义格式,如果是这种情况,您已经有了一个好的解决方案。
如果你想了解更多关于 headers 的知识,你应该看看 JPEG header 规范,很简单。http://www.fastgraph.com/help/jpeg_header_format.html
有关读取二进制 jpeg 标头的 Python 代码示例,请参阅这篇文章。Python: Check if uploaded file is jpg
【讨论】:
我认为他是指 CSV 标头意义上的标头。 您可能是对的,但 CSV 文件仍然是纯文本文件。没有什么特别之处可以将标题与内容分开。甚至 Excel 和 Google 电子表格也会询问用户第一行是否为标题。不知道底层数据集就没有神奇的解决方案。 OP 并不要求对所有可能的文件提供通用解决方案;他有一个(大概)定义明确的格式,他向我们展示了一个示例,以及成功处理它的代码。 (而且我不确定纯文本与它有什么关系——二进制文件也是一个字符流,除非你知道格式,否则你不能将标题与上下文分开。 )以上是关于Python中的内置函数用于检查文本文件中的标题的主要内容,如果未能解决你的问题,请参考以下文章