Python 从文本文件中 grep 字段并将输出写入 csv 文件的脚本

Python script to grep fields from text file and writing output in csv file

我正在编写一个 python 脚本。需要您的帮助来更正我在 python 3.x 或 python 2.6

中的脚本

对于每个输入文件,需要在另一个目录中单独输出文件
我们有多个名称为 suppose(1.1.1.2.txt, 1.1.1.3.txt) 的输入文件,其中包含由空行分隔的相同数据集
需要在输入文件(文本文件)的下面一行进行 grep 并保持 "ave rate from user(bps)" 作为列标题,“17104773”作为其在行中的值,类似地,"ave rate to user(bps)" 在另一列标题中,“247272821”作为另一个 CSV 文件中行中的值。

session: 43  ave rate from user(bps) : 17104773      ave rate to user(bps)   : 247272821

输入文件:在 运行 命令之后

show sub data-rate smgr-instance 43

需要 grep 并将 43 放入输出文件的第一列。这个43是动态值

[local]AM-SI-SP-01# show sub data-rate smgr-instance 43
Thursday July 1 17:10:45 IST 
Total Subscribers       : 2978
Active                  : 2978          Dormant                 : 0
peak rate from user(bps): n/a*          peak rate to user(bps)  : n/a*
ave rate from user(bps) : 17104773      ave rate to user(bps)   : 247272821
sust rate from user(bps): 16999794      sust rate to user(bps)  : 246777077
peak rate from user(pps): n/a*          peak rate to user(pps)  : n/a*
ave rate from user(pps) : 13117         ave rate to user(pps)   : 27879
sust rate from user(pps): 13233         sust rate to user(pps)  : 27976

[local]AM-SI-SP-01# show sub data-rate smgr-instance 45
Thursday July 1 17:10:45 IST 
Total Subscribers       : 2978
Active                  : 2978          Dormant                 : 0
peak rate from user(bps): n/a*          peak rate to user(bps)  : n/a*
ave rate from user(bps) : 17104234      ave rate to user(bps)   : 24728978
sust rate from user(bps): 16999794      sust rate to user(bps)  : 246777077
peak rate from user(pps): n/a*          peak rate to user(pps)  : n/a*
ave rate from user(pps) : 13117         ave rate to user(pps)   : 27879
sust rate from user(pps): 13233         sust rate to user(pps)  : 27976

我的代码:

import os
import csv
import re
from io import BytesIO

def parseFile(somefile):

    data = dict()
    with open(somefile, 'r') as f :

        lines=f.read()
        sub="ave rate from user(bps)"
        if (lines.find(sub))==-1:
            print ("nothing")
        else:
            splitted = lines.split(':')
            data["Hostname"] = splitted[1]
            print (data)



        #print("mylines",lines)
        for line in lines:


            line = line.rstrip("\n")
            print ("line",line)
            #print (lines)
            #print (type(line))


            if (lines.startswith(sub)):
                print ("nothing")

            #continue;
            else:



                print (data)
        #return data
    #print (data)

parseFile("C:\Users\ajachaud\Desktop\scripts\abc\fileName.txt")

if __name__ == "__main__":
    inputsDirectory = "C:/Users/ajachaud/Desktop/scripts"
    path = os.path.abspath(inputsDirectory)
    fileList = ["{}/{}".format(path,x) for x in os.listdir(inputsDirectory)]
   # print(fileList)

    # Load Each File and Build Dictionary
    csvRows = []
    for file in fileList:
        newRow = parseFile(file)
        csvRows.append(newRow)

   # print(csvRows)

    # Output CSV using dictionaries for each file
    outputFile = "output.csv"
    with open(outputFile, 'w', newline='') as csvfile:
        fieldnames = ["Hostname",
                      "loopback"]
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

        writer.writeheader()
        for row in csvRows:
            writer.writerow(row)

csv 文件中的预期输出:

session,ave rate from user(bps),ave rate to user(bps)
   43    17104773            247272821
   45    17104234            24728978

使用正则表达式。

例如:

import re
import csv


with open("infile.txt") as infile, open("outfile.csv", "w") as outfile:
    data = infile.read()     #Read infile content
    ave_rate_from_user = re.search(r"ave rate from user\(bps\)\s*:\s*(\d+)\b", data)     #Search for `ave rate from user`
    if ave_rate_from_user:
        ave_rate_from_user = ave_rate_from_user.group(1)
    ave_rate_to_user = re.search(r"ave rate to user\(bps\)\s*:\s*(\d+)\b", data)  #Search for `ave rate to user`
    if ave_rate_to_user:
        ave_rate_to_user = ave_rate_to_user.group(1)

    writer = csv.writer(outfile)
    writer.writerow(["ave rate from user(bps)", "ave rate to user(bps)"])  #Write Header
    writer.writerow([ave_rate_from_user, ave_rate_to_user])    #Write Content
  • 应该适用于问题中提到的两个版本的 python。