2017-07-26 39 views
0

我想修改一些文本文件。但是我的脚本太长了。怎样才能使文字输出变得轻松简单?

怎么可以做得短?谁可以建议我的剧本。

我想制作循环acap = line[4] ucap = line[5] ucp = line[6] saved = line[8]值如tcap

下面是我的脚本。

with open("find_c_volume_show.txt", "r") as f: 
    for line in f: 
     if "%" in line: 
      line = line.split(',') 
      vser = line[0] 
      vol = line[1] 
      aggr = line[2] 
      node = line[7] 

      if 'TB' in line[3]: 
       tcap = str(line[3].split("TB")[0]) 
       tcap = float(tcap) if '.' in tcap else int(tcap) 
      elif 'GB' in line[3]: 
       tcap = str(line[3].split("GB")[0]) 
       tcap = (float(tcap) if '.' in tcap else int(tcap) /1024) 
      elif 'MB' in line[3]: 
       tcap = str(line[3].split("MB")[0]) 
       tcap = (float(tcap) if '.' in tcap else int(tcap) /1024 /1024) 
      elif 'KB' in line[3]: 
       tcap = str(line[3].split("KB")[0]) 
       tcap = (float(tcap) if '.' in tcap else int(tcap) /1024 /1024 /1024) 
      elif 'B' in line[3]: 
       tcap = str(line[3].split("B")[0]) 
       tcap = (float(tcap) if '.' in tcap else int(tcap) /1024 /1024 /1024 /1024) 
      else: 
       print ("Please check script.") 

      if 'TB' in line[4]: 
       acap = str(line[4].split("TB")[0]) 
       acap = float(acap) if '.' in acap else int(tcap) 
      elif 'GB' in line[4]: 
       acap = str(line[4].split("GB")[0]) 
       acap = (float(acap) if '.' in acap else int(tcap) /1024) 
      elif 'MB' in line[4]: 
       acap = str(line[4].split("MB")[0]) 
       acap = (float(acap) if '.' in acap else int(tcap) /1024 /1024) 
      elif 'KB' in line[4]: 
       acap = str(line[4].split("KB")[0]) 
       acap = (float(acap) if '.' in acap else int(tcap) /1024 /1024 /1024) 
      elif 'B' in line[4]: 
       acap = str(line[4].split("B")[0]) 
       acap = (float(acap) if '.' in acap else int(tcap) /1024 /1024 /1024 /1024) 
      else: 
       print ("Please check script.") 

      if 'TB' in line[5]: 
       ucap = str(line[5].split("TB")[0]) 
      ..... 

      if 'TB' in line[6]: 
       ucp = str(line[6].split("TB")[0]) 

      ..... 

      if 'TB' in line[8]: 
       saved = str(line[8].split("TB")[0]) 

      ..... 
      line = vser, vol, aggr, tcap, acap, ucap, ucp, saved 
    print (line) 

我想在文本中匹配TB容量格式。下面是 是我的文本文件。

Vserver,Volume,Aggregate,Total,Avail,Used,UsedP,Node,Saved 
FAS8040-ZZZZ,vol0,Node1_aggr0,466.6GB,436.0KB,30.60MB,6%,FAS8040-ZZZZ,0B 
FAS8040-YYYY,vol0,Node2_aggr0,46.6GB,428.6KB,38.07B,8%,FAS8040-YYYY,23KB 
FAS8040-XXXX,vol0,Node1_aggr0,466GB,436.0GB,30.60GB,6%,FAS8040-XXXX,44GB 
FAS8040-AAAA,vol0,Node2_aggr0,466.6TB,428.6MB,38.07MB,8%,FAS8040-AAAA,102MB 
+1

'elif的 'GB':',你的意思'elif的 'GB' 本着[3]:'? – cdarke

+1

太长了?这是30行,这是什么问题? – JulienD

+0

当你说你的脚本太长,你的意思是太多的代码行,或者你的意思是它太慢? – cdarke

回答

1

也许这将帮助你开始:

unit = ['TB', 'GB', 'MB', 'KB', 'B'] 
with open("find_c_volume_show.txt", "r") as f: 
    for line in f: 
     if "%" in line: 
      line = line.split(',') 
      out = [] 
      for l in line[3:6] + [line[8]]: 
      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[:-1] + line[6:8] + [out[-1]] 
      print(line) 
+0

非常感谢。但我无法取得成果。该脚本不起作用。请解释你的脚本。我不明白'line = line [0:3] + out [: - 1] + line [7] + out [-1]' – KJ9

+0

嗨,是的,我做了一些更改,这应该会更好。您提到的这一行只是将多个列表连接成一个列表。 'list'的python中的'+'运算符只是执行连接。请注意,这行代码有错误,我在更新的答案中更正了它。 –

+0

太棒了!非常感谢。 – KJ9

相关问题