0

那里有很多关于读取输入文件的问题,但我见过的没有一个对我有帮助。如果我先向您展示输入文件的一部分,可能更容易理解。输入文件是由程序创建的,所以我无能为力。

SECLFXX   150.00   0.000   35.000  3.213E+03 -7.624E+03  8.274E+03  -67.151
                           17.000 -3.549E+04  1.012E+04  3.690E+04  164.084
                           16.000 -4.755E+04 -5.719E+03  4.789E+04 -173.141
                           15.500 -4.591E+04 -2.862E+04  5.410E+04 -148.062
                           15.000 -2.781E+04 -7.743E+04  8.227E+04 -109.756
                           14.500  2.492E+04 -1.973E+05  1.988E+05  -82.799

SECLFXY   150.00   0.000   35.000  3.213E+03 -7.624E+03  8.274E+03  -67.151
                           17.000 -3.549E+04  1.012E+04  3.690E+04  164.084
                           16.000 -4.755E+04 -5.719E+03  4.789E+04 -173.141
                           15.500 -4.591E+04 -2.862E+04  5.410E+04 -148.062
<square box>    
                           15.000 -2.781E+04 -7.743E+04  8.227E+04 -109.756
                           14.500  2.492E+04 -1.973E+05  1.988E+05  -82.799

<data from 4 more force components: FXZ, MXX, MXY and MXz here>

我放在那里只是一个指示。输入文件中有一个实际的方框(不仅仅是一个空格),但它无法在此消息中显示。

我试图将 FXX 和 FXY 上的第一列(从 35.0 开始)和第二列从右侧放入单独的列表中,即 Fxx = [.,.,.,.] 和 Fxy = [.,.,., .,.]。然后我想写入一个新文件。

我知道一列中应该有多少元素(在这种情况下为 6),所以我一直在尝试搜索“SECL”,然后将该行加上接下来的 5 个元素写入文件中。这适用于 FXX,但不适用于 FXY。post_inpfile 是您可以进一步看到的输入文件的名称。post_inppath 是同一文件的路径。

# <irrelevant code here>
frequency = []
force_count = 0
Fxx = []
Fxy = []
num_freq = 6

for linenum,line in enumerate(post_inpfile, 1):
  if len(line.split())==0: # Check if line is empty, and if so skip it. Also catches square boxes
    pass
  else:
    try:
      if line.split()[0][0:4] == 'SECL':
        force_count+=1
        for i in range(num_freq):
          freq = linecache.getline(post_inppath, linenum+i)
          if freq_count==0:
            try:
              frequency.insert(0,freq.split()[-5])
            except:
              pass
          if force_count==1:
            try:
              Fxx.insert(0,freq.split()[-2])
            except:
              pass                
          elif force_count==2:
            try:
              Fxy.insert(0,freq.split()[-2])
            except:
              pass
          <same check for 4 more force components>  
        freq_count+=1 # Makes sure frequency list is only created once               
   except:
     pass

# <more irrelevant code>

我在 Fxx、Fxy 等上使用了插入而不是附加,因为它们应该从低频率到高频率排序。

这将生成一个包含 6 个元素的 Fxx 列表,但生成一个包含 5 个元素的 Fxy 列表。全部都应该是 6。我已经考虑将“for”循环(for i in range(num_freq))放入每个组件的 while 循环中,以查看长度是否为 6。但是,我不太确定该怎么做这虽然只读取一次文件,但似乎这个解决方案会产生很多不必要的代码。我会更普遍、更优雅地做到这一点。

值得一提的是,列表可以包含任意数量的元素,而不仅仅是 6 个。而且这些方框是随机放置的。

如果这篇文章中缺少某些信息,请告诉我。非常感谢您的帮助。这不是学校作业。

4

1 回答 1

0

添加这样的东西

import re
check=re.compile("\d")
def hasnumbers(a):
    return check.search(a)

然后hasnumbers(line)将为好行返回 true,为空白行和“框”行返回 false

于 2013-08-13T08:53:48.510 回答