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

标签 python linux

我有一个 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) 的行都是一行数字数据。但事实并非如此:表格的标题行之一也只有四个字段。

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

关于python - 无法将字符串转换为数据 - python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20243375/

相关文章:

java - 从绝对路径转换为相对路径

Python 正则表达式 : "re.match()" works differently than "re.sub()" for regex

Python:如何将while循环的值之和存储到一个变量中?

python - 如果行以字母表中的任何字母开头,则打印行

Linux 日期 : invalid date

linux - 使用 shell 命令比较 ZIP 文件和目录

c++ - 为使用 class_<> 导出的类绕过 to_python 注册表?

python - 应用程序错误日志在哪里?

linux - 翻译 : tr does not recognise scandinavian character set

linux命令使用主机名和端口号连接到另一台服务器