当文件有时在python中包含随机空行时,如何从输入文件中获取多行

时间:2013-08-13 08:42:34

标签: python python-2.7

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

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>

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

我试图获得第一列(从35.0开始)和FXX和FXY右边的第二列到单独的列表中,即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>

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

这会生成一个包含6个元素的Fxx列表,但会生成一个包含5个元素的Fxy列表。所有应该是6.我已经将这个'for'循环(对于i在范围(num_freq)中)放入每个组件的while循环中以查看长度是否为6.但是,我不确定该怎么做这只是一次只读取文件,而且这个解决方案似乎产生了很多不必要的代码。我会更普遍和优雅地做到这一点。

应该提到的是,列表可以包含任意数量的元素,而不仅仅是6.这些方框是随机放置的。

如果此帖中缺少某些信息,请告知我们。 非常感谢您的帮助。这不是学校的工作。

1 个答案:

答案 0 :(得分:0)

添加类似这样的内容

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

然后hasnumbers(line)将返回true表示良好的行,false表示空白和“box”行