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

2024-04-24 12:49:30 发布

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

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

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\u inpfile是您可以进一步看到的输入文件的名称。post\u 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等上使用insert而不是append,因为它们应该从低频到高频排序。你知道吗

这会生成一个包含6个元素的Fxx列表,但会生成一个包含5个元素的Fxy列表。都应该是6。我建议将for循环(for I in range(num\u freq))放到while循环中,以查看每个组件的长度是否为6。但是,我真的不知道如何做到这一点,而只读取一次文件,而且似乎这个解决方案产生了很多不必要的代码。我想做得更一般,更优雅。你知道吗

应该提到的是,列表可以包含任意数量的元素,而不仅仅是6个。那些方块是随机放置的。你知道吗

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


Tags: 文件元素列表forifcountlinepass