Skip to main content
 首页 » 编程设计

python之无法将字符串转换为数据之python

2026年04月16日36arxive

我有一个 python 脚本,它将文件从 .dat 转换为 .csv。但是,我对这个脚本有误。

我的代码:

import os 
import sys 
import math 
 
_NAME = os.path.split(sys.argv[0])[1]   #who am i? 
_TOR = 1e-10 
 
if len(sys.argv)>2: 
    datFile=sys.argv[1] 
    outFile=sys.argv[2] 
 
else: 
    print("usage > python  %s  infile   outfile    " % _NAME) 
    print("   ex > python  %s  ndisp.dat ndisp.csv " % _NAME) 
    sys.exit()  
 
lineCount=0 
 
def ReadInp(fi): 
    global lineCount 
    s=fi.readline() 
    if (s!=""): 
        lineCount=lineCount+1 
    return s 
 
""" 
 displacements (vx,vy,vz) for set NDISPI1 and time  0.1562500E-01 
 
   255 -4.3462E-05  1.4730E-04  0.0000E+00 
  1431 -4.1070E-05  0.0000E+00  0.0000E+00 
 
 displacements (vx,vy,vz) for set NDISPO1 and time  0.1562500E-01 
 
      2733  1.0723E-04 -4.4200E-05  0.0000E+00 
  2880  1.0488E-04  0.0000E+00  0.0000E+00 
""" 
 
fi = open(datFile,'r') 
fo = open(outFile,'w') 
 
sFind1="DISPLACEMENTS (VX,VY,VZ) FOR SET" 
sFind2="AND TIME" 
nFind1=len(sFind1) 
nFind2=len(sFind2) 
 
s1="" 
sName="" 
sTimeOld="" 
sTime="" 
ss="" 
flgHeader=False 
while True: 
    s=ReadInp(fi) 
    if (s==""): 
        break 
s1=s.strip() #chomp 
s2=s1.split() 
n2=len(s2) 
iName1=s1.upper().find(sFind1) 
if (iName1 != -1 ): 
    iName2=s1.upper().find(sFind2) 
    sName=s1[iName1+nFind1:iName2].strip() 
    sTime=s1[iName2+nFind2:].strip() 
    if( (sTime != sTimeOld)): 
        if( sTimeOld != "" ): 
            if (flgHeader==False): 
                flgHeader=True 
                ns=int(len(ss.split(",")))/7 
                sHeader="Name,Time,Node,ux,uy,uz,uAll,"*ns 
                fo.write(sHeader) 
                fo.write("\n") 
            fo.write(ss) 
            fo.write("\n") 
            ss="" 
            print(sTime) 
        sTimeOld=sTime 
elif ( n2 == 4 ): 
    Node=int(s2[0]) 
    ux=float(s2[1]) 
    uy=float(s2[2]) 
    uz=float(s2[3]) 
    uAll=math.sqrt(ux*ux+uy*uy+uz*uz) 
 
    ss=ss+"%s,%s,%d,%g,%g,%g,%g," % (sName , sTime , Node,ux,uy,uz,uAll ) 
 
if(ss != "" ): 
    fo.write(ss) 
    fo.write("\n") 
 
 
fi.close() 
fo.close() 

我运行这段代码有什么问题?

我的错误是:

Traceback (most recent call last): 
  File "do2csv.py", line 105, in <module> 
    ux=float(s2[1]) 
ValueError: could not convert string to float: NO 

我在 .dat 文件中的输入:

    E I G E N V A L U E   O U T P U T 
 MODE NO  EIGENVALUE             FREQUENCY 
                     (RAD/TIME)      (CYCLES/TIME) 
1   0.8040979E+04   0.8967150E+02   0.1427166E+02 
 
2   0.8040979E+04   0.8967151E+02   0.1427166E+02 
 
3   0.3158085E+06   0.5619685E+03   0.8944006E+02       
 
4   0.3158085E+06   0.5619685E+03   0.8944006E+02 
 
5   0.2476525E+07   0.1573698E+04   0.2504618E+03 
 
6   0.2476525E+07   0.1573698E+04   0.2504618E+03 
 
7   0.9513950E+07   0.3084469E+04   0.4909085E+03 
 
8   0.9513950E+07   0.3084469E+04   0.4909085E+03 
 
9   0.2601478E+08   0.5100468E+04   0.8117648E+03 
 
10   0.2601478E+08   0.5100468E+04   0.8117648E+03 

请您参考如下方法:

如果我没看错,您的代码假定任何包含四个字段 (n2 == 4) 的行都是一行数字数据。但事实并非如此:表格的标题行之一也只有四个字段。

您可以通过跳过任何以字母开头的行,或其中任何位置包含非数字字段的行,或者只跳过文件的前三行来避免此问题。