有很多关于阅读输入文件的问题,但我见过的一切都没有帮助过我。如果我首先向您显示输入文件的一部分,则可能更容易理解。输入文件是由程序创建的,所以我无能为力。
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.这些方框是随机放置的。
如果此帖中缺少某些信息,请告知我们。 非常感谢您的帮助。这不是学校的工作。
答案 0 :(得分:0)
添加类似这样的内容
import re
check=re.compile("\d")
def hasnumbers(a):
return check.search(a)
然后hasnumbers(line)
将返回true表示良好的行,false表示空白和“box”行