我写了一个简单的程序来从文件中读取一些浮点数:
line2 = f1.readline()
if "Totals" in line2:
cline = line2.strip()
csline= cline.split(" ")
zforcet = float(csline[7])
torquet = float(csline[8])
有问题的 line2
是:
Totals 7.911647E+03 -1.191758E+03 7.532665E+03 4.137034E+00
我的代码有效,但我的问题是,有一个更明显的方法来编写代码吗?
我的意思是,对我来说,线上的第二个实数是csline[7]
并不是很明显,我只能在跟踪和错误之后才能执行此操作并打印出csline
的内容。我正在寻找一种方法来阅读第二个浮标"在一条直线上。
答案 0 :(得分:2)
只需使用split()
它会在每个空格上拆分,你会得到一个这样的列表:
["Totals", "7.911647E+03", "-1.191758E+03", "7.532665E+03", "4.137034E+00"]
所以列表的第一个元素是"7.911647E+03"
另请注意,默认情况下它为string
,您必须使用float
函数将其设为浮点数。 (例如float("7.911647E+03")
)
编辑:正如评论中所强调的那样,如果您真的在寻找a way to "read the second float" on a line directly
,那么我将遍历分割线,并检查元素的类型,并获取第二个float
类型。
splitted_line = ["Totals", "7.911647E+03", "-1.191758E+03", "7.532665E+03", "4.137034E+00"]
counter = 1
for i in splitted_line:
try:
float(i)
counter += 1
if counter== 2:
print(i)
except ValueError:
pass
这将打印出7.911647E+03
答案 1 :(得分:0)
如果我们无法确定一行中的第二个数字(您想要的)总是第三个单词(以空格分隔的字符/数字),我会选择自动试用和错误:
line2 = f1.readline()
if "Totals" in line2:
numbers = []
for word in line2.split():
try:
number.append(float(word))
except ValueError:
pass
zforcet = numbers[2] if len(numbers) > 2 else 0
torquet = numbers[3] if len(numbers) > 3 else 0
我们将该行拆分为单词并尝试将每个单词转换为浮点数。如果成功,我们会将号码附加到我们的列表中,如果不是,我们就不在乎。
然后在解析了这一行后,我们可以简单地从输出数字列表中选择第n个数字 - 如果我们无法解析足够的数字,则可以选择默认值(0)。
答案 2 :(得分:0)
你想要:
list
line2
为此你必须:
float
line2
并将每个元素传递给辅助函数在line2
中有一个实际浮动列表后,只需要知道要选择哪个项目(在这种情况下,第二个,floats[1]
。
-
def is_float(e):
try:
float(e)
except ValueError:
return False
return True
def get_floats(line):
return [float(item) for item in line.rstrip().split() if is_float(item)]
之后您的代码变为:
line2 = f1.readline()
if "Totals" in line2:
floats = get_floats(line2)
zforcet = floats[1] # -1191.758
torquet = floats[2] # 7532.665
这不是那么短,但更清晰,更容易调试。
如果您打算重复使用上述代码,您还可以抽象出要选择的项目的索引:
ZFORCET = 1
TORQUET = 2
然后:
line2 = f1.readline()
if "Totals" in line2:
floats = get_floats(line2)
zforcet = floats[ZFORCET]
torquet = floats[TORQUET]