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 而不是引发异常,但除此之外,它应该适用于与原始代码完全相同的用例。

通常我什至不会提及这一点,但由于您将问题标记为“优化”,我想您很在意:从理论上讲,这段代码比您的代码要快,原因应该很明显,但在现实生活中,它几乎总是没有区别。根据我机器上的%timeitread/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中的内置函数用于检查文本文件中的标题的主要内容,如果未能解决你的问题,请参考以下文章

python内置函数中的 IO文件系列 open和os

python内置函数中的 IO文件系列 open和os

利用Python的 counter内置函数,统计文本中的单词数量

Win10中的拼写检查文本框 - 慢

检查文本文件中的完全匹配

如何在C++中 统计多行文本中的行数、单词数及字符数