从文本文件中提取数据列表

时间:2017-03-26 14:05:56

标签: python list extract

我的问题是如何从有限元程序(ABAQUS)中提供的文本文件中提取两个数字列表。实际上,文本中的X列是timeForce-1force。获得这两个列表后,我想做一些数学运算来达到我的目标。

我的文本文件如下:除了第一行,还有其他空行,但我现在无法确切地说出它们的数量。例如,我的文本文件的最后四行是空的,我真的不知道哪些其他行也是空的。

<blank line>
              X               FORCE-1
<blank line>
            0.                 0.
           10.E-03            98.3479E+03
           12.5E-03          122.947E+03
           15.E-03           147.416E+03
           18.75E-03         183.805E+03
           22.5E-03          215.356E+03
           26.25E-03         217.503E+03
           30.E-03           218.764E+03
           33.75E-03         219.724E+03
           37.5E-03          220.503E+03
           43.125E-03        221.938E+03
           51.5625E-03       228.526E+03
           61.5625E-03       233.812E+03
<blank line>
<blank line>
<blank line>
<blank line>

你能告诉我如何在python中编写这段代码,可以找到这些空行,只提取数字,然后得到如下的两个数字列表,例如X(time)

['0.', '10.E-03', '12.5E-03', '15.E-03', '18.75E-03', '22.5E-03', '26.25E-03', '30.E-03', '33.75E-03', '37.5E-03', '43.125E-03', '51.5625E-03', '61.5625E-03']

(我在一分钟前问了一个类似的问题,我得到的答案毕竟没有帮助我!)

1 个答案:

答案 0 :(得分:1)

您必须遍历文件的每一行,创建条件以跳过不相关的行,并操纵剩余的行以将数据提取到数据结构中。代码注释中的解释:

with open("my_file.txt", "rb") as f: # Open file in read-binary mode
    lines = f.readlines() # Load all lines

x = []
force = []
for line in lines:
    try:
        stripped = line.strip() # Remove extra surrounding whitespace
        if stripped: # This will be false if the line is empty
            x_value, force_value = stripped.split() # Split by the middle whitespace into two values
            # Append data to each list
            # Pass a scientific notation string to float() will make the data more usable
            x.append(float(x_value))
            force.append(float(force_value))
    except ValueError
        pass

print x
print force

编辑:原来的答案是切断了第一行,但由于你仍然遇到错误,我只是跳过不使用try: except:块来包含数据值的行。标题值X传递到float()会发生什么,并且因为它无法解析为浮点数,所以它会引发ValueError。由于它位于try语句块中,因此会查看我们是否在ValueError块中处理except。我们是,因此它运行此代码而不会引发错误。由于我们只是pass,我们继续迭代到下一行。