我有一个文本文件,在该文件的某些地方,有一行包含以下内容
xxxx xxxx y = 4.63456
其中xxxx代表该行不感兴趣的部分。我的目标是提取y = 4.63456值并将其写入新的文本文件。这是我到目前为止所拥有的。
import os
import re
my_absolute_path = os.path.abspath(os.path.dirname(__file__))
with open('testfile', 'r') as helloFile, open('newfile32','a') as out_file:
for line in helloFile:
numbertocheck= []
if 'x' in line and ' = ' in line and numbertocheck==type(float) in line:
out_file.write(line)
代码创建文件,但是文件为空。这是检查if语句中条件的正确方法吗? FWIW,如果我在最后删除了两个条件并写了if x in line:
,则代码可以正常工作,但会打印出整行。
答案 0 :(得分:0)
numbertocheck==type(float)
可能是您的罪魁祸首。当到达代码中的那一点时,numbertocheck
是一个列表,因此它永远不会是float类型。您可以通过运行type(numbertocheck)
进行检查。
不清楚您要对空列表numbertocheck
做什么,以及为什么需要使其浮空。如果您提供更多信息,我们可能会更好地指导您。
根据评论进行编辑:
让我们假设您对numbertocheck
的期望是检查4.63456
中的xxxx xxxx y = 4.63456
值是否为有效浮点数。
您需要从line
字符串中提取浮点值。正则表达式适用于此,但是确切的答案取决于您对给定行中可能的值的了解或不了解。
如果您确定数字始终带有小数点,
import re
numbertocheck = re.findall("\d+\.\d+", line)
将提取“浮动”值。如果不能保证小数点,请改用re.findall(r"[-+]?\d*\.\d+|\d+", line)
。
如果您的行中存在多个数字,则可能会返回多个数字。如果line
中的其他地方(例如xxxx xxxx
部分)可能有数字,并且如果您只关心行尾的数字,那么这可能有用。 / p>
for line in helloFile:
numbers_in_line = re.findall(r"[-+]?\d*\.\d+|\d+", line)
# Make sure a number was found
if len(numbers_in_line) == 0:
continue
else:
try:
last_num = float(numbers_in_line[-1])
except ValueError:
continue
# By this point, you've confirmed if a number was found and if it's a float
if 'x' in line and ' = ' in line:
out_file.write(line)
请注意,这将允许不带小数点的数字计为有效数字;您可以根据需要进行修改。