假设有一个包含数字和注释的文件,如:
#comments
12 #this is number
2.4 #this is float
读取文件并将数字附加到列表中。 我试图得到只是数字,但不知何故它附加#this是数字而#this是浮点数。
答案 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.1e2
,nan
,-inf
,3
等。它有效,因为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代码时存在安全注意事项,如果您对数据文件的控制少于对脚本的控制,则任意代码执行可能是程序的漏洞你用它来执行它。