从非二次选项卡读取数组

2024-10-01 22:28:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我在阅读这样的表格时遇到问题:

$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读入它时,我无法再正确地将它转换为float

    PunchData=loadtxt(PunchFile,skiprows=6)

ValueError: could not convert string to float: G

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

    kwargs=dict(dtype=float,
    跳过标题=6,
    缺少值={0:“”,1:“”,2:“”,3:“”,4:“”,5:”“},
    填充值={0:0,1:0,2:0,3:0,4:0,5:0})
    PunchData=genfromtxt(PunchFile,**kwargs)

ValueError: Some errors were detected !
Line #8 (got 5 columns instead of 6)
Line #10 (got 5 columns instead of 6)
Line #12 (got 5 columns instead of 6)
Line #14 (got 5 columns instead of 6)
Line #16 (got 5 columns instead of 6)

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

    f=打开(PunchFile)
    行=f.readlines()
    线条=线条[6:]
    数据=[]
    对于行中的行:
    data.append(第[24:])

['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']

所以我真的很挣扎,不知道怎么继续下去。你们能帮帮我吗


Tags: columnsof数据方法numpy标题linefloat
1条回答
网友
1楼 · 发布于 2024-10-01 22:28:15

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

  • 注释指示符($)
  • 续行指示符(-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())

相关问题 更多 >

    热门问题