在python中读取第二行浮点数

时间:2016-04-20 12:00:09

标签: python parsing

我写了一个简单的程序来从文件中读取一些浮点数:

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的内容。我正在寻找一种方法来阅读第二个浮标"在一条直线上。

3 个答案:

答案 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)

你想要:

  1. 使用list
  2. 中的所有浮点值生成line2
  3. 使用该列表的第二个元素执行某些操作
  4. 为此你必须:

    1. 创建帮助函数以检查某些内容是否为float
    2. 拆分line2并将每个元素传递给辅助函数
    3. 仅保留实际花车
    4. 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]