Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使文本输出简单、快捷?_Python_Loops_If Statement_Find_Output - Fatal编程技术网

Python 如何使文本输出简单、快捷?

Python 如何使文本输出简单、快捷?,python,loops,if-statement,find,output,Python,Loops,If Statement,Find,Output,我想修改一些文本文件。但是我的剧本太长了 你怎么能缩短?谁能对我的剧本提出建议 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]

我想修改一些文本文件。但是我的剧本太长了

你怎么能缩短?谁能对我的剧本提出建议

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)
我想让循环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

也许这将帮助您开始:

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)

elif'GB':,你是说第[3]行中的elif'GB':?太长了,什么意思?它有30行长,有什么问题吗?当你说你的脚本太长时,你是说代码太多了,还是说太慢了?我想你可以简化它,但不会有任何区别。25行或30行是相同的…我编辑我的问题。我的脚本将是add if loop for ucap=line[5]ucp=line[6]saved=line[8]。请再查一下,非常感谢。但我无法得出结果。那剧本不管用。请解释你的剧本。我不明白line=line[0:3]+out[:-1]+line[7]+out[-1]嗨,是的,我做了一些修改,这应该会更好。您提到的行只是将多个列表连接到一个列表中。python中的+运算符只执行串联。请注意,这行代码有一个错误,我在更新的答案中更正了它。太棒了!非常感谢。我添加了那个代码的输出脚本。但这会使错误回溯最后一次调用:文件3.sum_data.py,第70行,在f.writeline+“\n”TypeError中:只能将列表而不是str连接到列表我将此脚本添加到打印位置。f=openmod\u c\u vol\u size.txt,“w”f.writeVserver,Volume,Aggregate,Total,Avail,Used,UsedP,Node,Saved\n f.writeline+“\n”f.close您正在将“\n”这是一个字符串添加到作为列表的行中。要解决此问题,请执行以下操作:f.write','.joinline+'\n'