2017-07-28 19 views
1

私は記憶容量を変更するためのスクリプトを作成したいが、私はいくつかの問題がある。どのようにPython上で出力を動作させることができますか?

Traceback (most recent call last): 
    File "test.py", line 20, in <module> 
    mod_f.write(','.join(line) + '\n') 
TypeError: sequence item 3: expected string, float found 

以下は私のスクリプトです:

私のスクリプトは、以下のエラーが発生しました。

mod_f = open("mod_c_vol_size.txt", 'w') 
mod_f.write("Vserver,Volume,Aggregate,Total,Avail,Node,SaveA,SaveD,SaveC,Snap,Tused\n") 
unit = ['TB', 'GB', 'MB', 'KB', 'B'] 
with open("find_c_vol_modify.txt", "r") as f: 
     next(f) 
     for line in f: 
       if len(line.strip()) != 0: 
         line = line.split(',') 
         out = [] 
         for l in line[3:5] + line[6:11]: 
           l = l.replace('\n','') 
           try: 
             ind = [unit[i] in l for i in range(5)].index(True) 
           except ValueError: 
             print('please check script') 

           val = str(l.split(unit[ind])[0]) 
           out.append(float(val)/1024**ind) 
         line = line[0:3] + out[:-5] + line[5:6] + out[2:] 
         print (line) 
mod_f.write(','.join(line) + '\n') 
mod_f.close() 

エラーは以下の行でmod_f.write(','.join(line) + '\n')

である私の入力テキストファイルです。

Vserver,Volume,Aggregate,Total,Avail,Node,SaveA,SaveD,SaveC,Snap,Tused 
XXXX,YYYY,Node1_aggr1,1TB,1023GB,FAS8040-ZZZZ,0B,0B,0B,0B,177.7MB 
XXXX,ZZZZ,Node1_aggr1,3TB,3.00TB,FAS8040-ZZZZ,0B,0B,0B,0B,1.60GB 
XXXX,CCCC,Node1_aggr1,1TB,907.9GB,FAS8040-ZZZZ,0B,0B,0B,0B,116.1GB 
XXXX,VVVV,Node1_aggr1,200GB,200.0GB,FAS8040-ZZZZ,0B,0B,0B,0B,6.25MB 

下記の出力ファイルが必要です。

['XXXX', 'YYYY', 'Node1_aggr1', 1.0, 0.9990234375, 'FAS8040-ZZZZ', 0.0, 0.0, 0.0, 0.0, 0.00016946792602539061] 
['XXXX', 'ZZZZ', 'Node1_aggr1', 3.0, 3.0, 'FAS8040-ZZZZ', 0.0, 0.0, 0.0, 0.0, 0.0015625] 
['XXXX', 'CCCC', 'Node1_aggr1', 1.0, 0.88662109375, 'FAS8040-ZZZZ', 0.0, 0.0, 0.0, 0.0, 0.11337890625] 
['XXXX', 'VVVV', 'Node1_aggr1', 0.1953125, 0.1953125, 'FAS8040-ZZZZ', 0.0, 0.0, 0.0, 0.0, 5.9604644775390625e-06] 
+0

私の解決策が問題を解決した場合は、回答を受け入れて投票してください。 – JRG

答えて

0

あなたの問題は、この行である:

out.append(float(val)/1024**ind)

あなたが文字列でないリストにfloatタイプを追加しています。

.join(list)を使用するには、listを文字列のみで構成する必要があります。

あなたが最初の文字列として追加しようとしているものをキャストタイプによってこの問題を解決することができます

out.append(str(float(val)/1024**ind))

1

expected string, float foundは、文字列に変換

.... 
line = [str(x) for x in line]   
print(','.join(line) + '\n') 
+0

行はリストですが、修正プログラムは実行されますが、期待通りに動作しません。 –

+0

ああ申し訳ありませんが、回答を – ewwink

+0

更新Looks better :) –

1

line、リスト内の4番目の項目計算されたfloat要素です:1.0, 3.0, 1.0, 0.1953125(後の要素と同様)。 joinは文字列でのみ機能します。 floatアイテムをstringに変換する必要があります。おそらく、

out.append(str(float(val)/1024**ind)) 

またはいくつかの一般あなたは

line = [str(item) for item in line] 
1

インデントを書く直前に問題を抱えていた、あなたは、ファイルへの書き込み時にstr(line)を使用する必要があります。

あなたはmod_f.write(str(line) + '\n')

を使用することができます代わりにmod_f.write(','.join(line) + '\n')を必要としないあなたのケースでjoinの使用に関する私の溶液中で、以下のNOTE:をご確認ください。

mod_f = open("mod_c_vol_size.txt", 'w') 
mod_f.write("Vserver,Volume,Aggregate,Total,Avail,Node,SaveA,SaveD,SaveC,Snap,Tused\n") 
unit = ['TB', 'GB', 'MB', 'KB', 'B'] 
with open("find_c_vol_modify.txt", "r") as f: 
    next(f) 
    for line in f: 
     if len(line.strip()) != 0: 
      line = line.split(',') 
      out = [] 
      for l in line[3:5] + line[6:11]: 
       l = l.replace('\n','') 
       try: 
        ind = [unit[i] in l for i in range(5)].index(True) 
       except ValueError: 
        print('please check script') 
       val = str(l.split(unit[ind])[0]) 
       out.append(float(val)/1024**ind) 
      line = line[0:3] + out[:-5] + line[5:6] + out[2:] 
      print (line) 
      mod_f.write(str(line) + '\n') 
mod_f.close() 

実行サンプル

['XXXX', 'YYYY', 'Node1_aggr1', 1.0, 0.9990234375, 'FAS8040-ZZZZ', 0.0, 0.0, 0.0, 0.0, 0.00016946792602539061] 
['XXXX', 'ZZZZ', 'Node1_aggr1', 3.0, 3.0, 'FAS8040-ZZZZ', 0.0, 0.0, 0.0, 0.0, 0.0015625] 
['XXXX', 'CCCC', 'Node1_aggr1', 1.0, 0.88662109375, 'FAS8040-ZZZZ', 0.0, 0.0, 0.0, 0.0, 0.11337890625] 
['XXXX', 'VVVV', 'Node1_aggr1', 0.1953125, 0.1953125, 'FAS8040-ZZZZ', 0.0, 0.0, 0.0, 0.0, 5.9604644775390625e-06] 

ファイルでの出力

enter image description here

NOTE:画面に、出力をファイルへの書き込み中にあなたがjoinを使用している場合は、良いことが、ファイルをチェックしますファイルは以下のような予期せぬ出力を持つでしょう

enter image description here

関連する問題