2017-07-28 100 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

看起来更好:) –

1

每个line列表中的第四个项目是您计算的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(','.join(line) + '\n')而是可以使用mod_f.write(str(line) + '\n')

请检查下面NOTE:在我关于你的案件join使用的解决方案。

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