忽略文件中的注释行

时间:2013-04-29 02:14:33

标签: python

假设有一个包含数字和注释的文件,如:

#comments
12 #this is number
2.4 #this is float

读取文件并将数字附加到列表中。 我试图得到只是数字,但不知何故它附加#this是数字而#this是浮点数。

3 个答案:

答案 0 :(得分:4)

您可以使用split

>>> 'foo #comment'.split('#', 1)[0]
'foo '
>>> 'foo comment'.split('#', 1)[0]
'foo comment'

答案 1 :(得分:2)

在这种简单的情况下,您不必使用更复杂,更慢的正则表达式机制re模块)。 str.split()是您的朋友

output = []

with open('somefile.txt') as f:
    for line in f:
        parts = line.split('#', 1)  # Maximum 1 split, on comments
        try:
            output.append(float(parts[0]))  # The single, or pre-comment part is added
        except ValueError:  # Beginning is not float-like: happens for "# comment", "    # comment", etc.
            pass  # No number found

这会自动处理浮动的所有可能语法1.1e2nan-inf3等。它有效,因为float()非常强大:处理尾随空格和换行符(通过忽略它们)。

这也非常有效,因为没有失败的try很快(通常比显式测试快)。

这也处理文件中间的注释。 如果您只在文件的开头 进行纯注释,我们可以简化代码并使用保证每行都有数字的事实:

output = []

with open('somefile.txt') as f:
    next(f)  # Skips the first, comment line
    for line in f:
        output.append(float(line.split('#', 1)[0]))  # The single or pre-comment part is guaranteed to be a float representation

我认为没有任何明确的方法比这更简单(除了用split('#')计算可能太多的行部分)。

也就是说,可以考虑使用implicit approach,就像abathur一样,eval(line)取代整个float(…)部分;但是,在这种情况下,代码不会显示浮点数是预期的,而Zen of Python表示“显式优于隐式”,所以我不建议使用eval()方法,除非它是一次性,快速和肮脏的剧本。

答案 2 :(得分:0)

虽然其他人已经介绍了文件阅读后勤,但我只想注意另一种方法:假设你的文件遵循Python的语法,你可以使用eval函数来获取行的值减去注释

>>> eval("10 #comment")
10

请记住,当eval()执行Python代码时存在安全注意事项,如果您对数据文件的控制少于对脚本的控制,则任意代码执行可能是程序的漏洞你用它来执行它。