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开头的行,或者,正如你所建议的,如果格式很清楚,直接跳过第一行。