从非二次表中读取数组

时间:2017-10-11 09:51:58

标签: python arrays text-files number-formatting

我在阅读看起来像这样的表时遇到了问题:

$TITLE   =                                                                     1
$SUBTITLE=                                                                     2
$LABEL   = SUBCASE - STATIC LOADS 1                                            3
$DISPLACEMENTS                                                                 4
$REAL OUTPUT                                                                   5
$SUBCASE ID =           1                                                      6
     1       G          1.100698E-02      1.961111E-03     -1.888102E-01       7
-CONT-                  0.000000E+00      0.000000E+00      0.000000E+00       8
     2       G          1.099767E-02      1.947526E-03     -1.814562E-01       9
-CONT-                  0.000000E+00      0.000000E+00      0.000000E+00      10
     3       G          1.097209E-02      1.915010E-03     -1.741153E-01      11
-CONT-                  0.000000E+00      0.000000E+00      0.000000E+00      12
     4       G          1.093050E-02      1.873149E-03     -1.667979E-01      13
-CONT-                  0.000000E+00      0.000000E+00      0.000000E+00      14
     5       G          1.087178E-02      1.827145E-03     -1.595153E-01      15
-CONT-                  0.000000E+00      0.000000E+00      0.000000E+00      16

我想要的是这样:

1.100698E-02      1.961111E-03     -1.888102E-01      0.000000E+00      0.000000E+00      0.000000E+00
1.099767E-02      1.947526E-03     -1.814562E-01      0.000000E+00      0.000000E+00      0.000000E+00
1.097209E-02      1.915010E-03     -1.741153E-01      0.000000E+00      0.000000E+00      0.000000E+00
1.093050E-02      1.873149E-03     -1.667979E-01      0.000000E+00      0.000000E+00      0.000000E+00
1.087178E-02      1.827145E-03     -1.595153E-01      0.000000E+00      0.000000E+00      0.000000E+00

所以我尝试了几件事,但我总是遇到一些问题。

  1. 首先我尝试通过numpy.loadtxt加载数据,省略标题行。但是我在获取正确的数据类型时遇到了问题。当我用dtype = string读取它时,我无法将其正确转换为浮动。

    PunchData = loadtxt(PunchFile,skiprows = 6)

  2.   

    ValueError:无法将字符串转换为float:G

    1. 之后我尝试使用genfromtxt来填充所有空列,因此他可以将其读作二次数组。但我无法使用,因为列数不匹配 - > number和G产生2列,-cont-产生1列。

      kwargs = dict(dtype = float,
                skip_header = 6,
                missing_values = {0:“”,1:“”,2:“”,3:“”,4:“”,5:“”},
                filling_values = {0:0,1:0,2:0,3:0,4:0,5:0})
      PunchData = genfromtxt(PunchFile,** kwargs)

    2.   

      ValueError:检测到一些错误!
            第8行(有5列而不是6列)
            10号线(有5列而不是6列)
            第12行(有5列而不是6列)
            第14行(有5列而不是6列)
            第16行(有5列而不是6列)

      1. 作为最后一种方法,我试图用readlines读取数据,但这与第一种方法的结果相同。我有一些字符串,我无法将其转换为numpy数组。

        f = open(PunchFile)
        线= f.readlines()
        线=线[6:]
        数据= []
        换行:
            data.append(线[24:])

      2.   

        ['1.100698E-02 1.961111E-03 -1.888102E-01 7 \ n',

           '0.000000E + 00 0.000000E + 00 0.000000E + 00 8 \ n',
           '1.099767E-02 1.947526E-03 -1.814562E-01 9 \ n',
           '0.000000E + 00 0.000000E + 00 0.000000E + 00 10 \ n',
           '1.097209E-02 1.915010E-03 -1.741153E-01 11 \ n',
           '0.000000E + 00 0.000000E + 00 0.000000E + 00 12 \ n',
           '1.093050E-02 1.873149E-03 -1.667979E-01 13 \ n',

           '0.000000E + 00 0.000000E + 00 0.000000E + 00 14 \ n',
           '1.087178E-02 1.827145E-03 -1.595153E-01 15 \ n',

           '0.000000E + 00 0.000000E + 00 0.000000E + 00 16']

        所以我真的很挣扎,不知道该怎么做。你们可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

只需手动处理 即可。您的行包含固定大小字段,后缀是行号,前缀可以是:

  • 评论指标($)
  • 延续线指示符(-CONT - )
  • 您忽略的行号和G

所以你必须:

  • 跳过以$
  • 开头的行
  • 每行只保留72个第一个字符
  • -CONT-开始到前一行,但跳过18个字符
  • 从不以-CONT-
  • 开头的行中跳过24个字符

它产生以下代码:

PuchData = []
with open(PunchFile) as fd:
    old = None
    for line in fd:
        if line.startswith('$'): continue
        line = line[:72]
        if line.startswith('-CONT-'):
            old += line[18:]
        else:
            if old is not None: PuchData.append(old.split())
            old = line[24:]
    data.append(old.split())