2013-11-27 3 views
0

У меня есть скрипт python и файл с .dat на .csv. Однако, я ошибаюсь в этом сценарии.не удалось преобразовать строку в данные - python

Мой код:

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 

Похоже, ваш пост является в основном код; добавьте еще несколько деталей.

+0

Пожалуйста, сообщите нам * что не так * с кодом. Какой вклад вы дадите, какой результат вы получаете, чего вы ожидали? Какие ошибки, если таковые имеются, вы видели? Без этой информации мы плаваем вслепую и вряд ли помогаем. –

+1

Я также подрезал некоторые комментарии и отпечатки в коде, чтобы сделать его немного более компактным. Удалите все, что не требуется для того, чтобы воспроизвести проблему. –

+0

Я добавил свою ошибку и удаляю ее. – user3026022

ответ

1

Если я читаю это правильно, ваш код предполагает, что любая строка с четырьмя полями (n2 == 4) будет линией числовых данных. Но это не так: одна из строк заголовка таблицы также имеет только четыре поля.

Вы можете избежать этой проблемы, пропуская любую строку, которая начинается с буквы, или содержит нечисловое поле в любом месте, или просто пропустите первые три строки файла.

Смежные вопросы