Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 忽略文件中的注释行_Python - Fatal编程技术网

Python 忽略文件中的注释行

Python 忽略文件中的注释行,python,Python,假设有一个文件包含一行数字和注释,如: #comments 12 #this is number 2.4 #this is float 读取文件并将数字附加到列表中。 我试图只获取数字,但不知怎的,它附加了#这是数字#这是浮点。您可以使用拆分: >>> 'foo #comment'.split('#', 1)[0] 'foo ' >>> 'foo comment'.split('#', 1)[0] 'foo comment' 您可以使用split: >

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

#comments
12 #this is number
2.4 #this is float
读取文件并将数字附加到列表中。
我试图只获取数字,但不知怎的,它附加了#这是数字#这是浮点。

您可以使用
拆分

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

您可以使用
split

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

虽然其他人已经讨论了文件读取逻辑,但我只想指出另一种方法:假设您拥有的文件遵循Python的语法,您可以使用函数获取行的值减去注释

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

当然,请记住,
eval()
在执行Python代码时会有安全方面的考虑,如果您对数据文件的控制比对正在执行它的脚本的控制少,那么任意代码执行可能是程序的一个漏洞。

,而其他人则涵盖了文件读取逻辑,我只想说明另一种方法:假设您拥有的文件遵循Python的语法,您可以使用函数来获取行的值减去注释

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

当然,请记住,
eval()
在执行Python代码时会有一些安全方面的考虑,如果您对数据文件的控制比对执行它的脚本的控制少,那么任意代码执行可能是程序的一个漏洞。

在这种简单的情况下,您不必使用更复杂、更慢的正则表达式机制(
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.1e2
nan
-inf
3
,等等)。它之所以有效,是因为
float()
功能非常强大:它处理尾随空格和换行符(通过忽略它们)

这也是非常有效的,因为不失败的
测试是快速的(通常比显式测试快)

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

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(“#”)
计算可能太多的行部分之外)


这就是说,可以考虑使用一种类似abathur的方法,其中
eval(line)
替换了整个
float(…)
部分;但是,在这种情况下,代码没有显示预期的浮动,正如所说的,“显式优于隐式”。因此,我不建议使用
eval()
方法,除非它是用于一次性、快速和肮脏的脚本。

对于这样一个简单的情况,您不必使用更复杂、更慢的正则表达式机制(
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.1e2
nan
-inf
3
,等等)。它之所以有效,是因为
float()
功能非常强大:它处理尾随空格和换行符(通过忽略它们)

这也是非常有效的,因为不失败的
测试是快速的(通常比显式测试快)

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

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(“#”)
计算可能太多的行部分之外)


这就是说,可以考虑使用一种类似abathur的方法,其中
eval(line)
替换了整个
float(…)
部分;但是,在这种情况下,代码并没有显示浮动是预期的,正如上面所说的,“显式优于隐式”。因此,我不建议使用
eval()
方法,除非它是用于一次性、快速和肮脏的脚本。

我们可以看到您的努力吗?您是否有很多行只包含注释,还是仅仅是第一行?+1:各种各样的答案表明,需要就最佳方法达成共识!我们能看看你的努力吗?你有很多只写评论的行吗,还是只是第一行?+1:答案的多样性表明,需要就最佳方法达成共识!我认为
split
会比
rsplit
好——如果你使用
rsplit
,那么
“foo###comment!”
会得到一个
。另外,如果你想永远抓住注释(不知道为什么,但是…)而不使用井号,你可以使用
string.partition()
为您进行划分。我认为
split
会比
rsplit
好——如果您使用
rsplit
,那么
“foo##comment!”
将以
结束。此外,如果您想要获取注释(不确定为什么,但是…),如果没有磅号,您可以使用
string.partition()
为您进行划分。这是个不错的主意,但在问题的“#注释”处失败。这是真的。我想您可以筛选以“first”开头的行,或者,正如您所建议的,如果格式很清楚,只需跳过第一行即可。这是个不错的主意,但在“#注释”处失败是的,没错。我想你可以过滤以#first开头的行,或者,正如你所建议的,如果格式很清楚,直接跳过第一行。