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

Posted

技术标签:

【中文标题】Python脚本从文本文件grep字段并将输出写入csv文件【英文标题】:Python script to grep fields from text file and writing output in csv file 【发布时间】:2019-07-15 12:01:49 【问题描述】:

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

对于每个输入文件都需要在另一个目录中单独输出文件 我们有多个名称为假设(1.1.1.2.txt,1.1.1.3.txt)的输入文件,其中一组相同的数据由空行分隔 需要从输入文件(这是文本文件)的下面的行中 grep 并保持“用户平均速率(bps)”作为列标题,“17104773”作为其行中的值,类似地“用户平均速率(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

【问题讨论】:

【参考方案1】:

使用正则表达式。

例如:

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 一起工作。

【讨论】:

我不会像输入文件那样对字符串进行硬编码,前提是他似乎需要的不仅仅是这两个。我会使用一个通用表达式来捕获": "(注意空格)之前的任何文本以及它之后的任何文本,直到找到一个空格。然后我会修剪第一部分以正确格式化字符串。之后我会继续为这条线做,直到找不到": " @Adirio 来自 OP 的问题 ..他们只需要这两个值....在示例代码中也提到了 sub="ave rate from user(bps)" @Rakesh..上述输入数据是在运行此命令“show sub data-rate smgr-instance 43”后出现的。现在,如果我想从这个命令中 grep 43 并显示在我们的输出文件中..只有这个命令中的数值会改变..我们如何实现这一点以获得像下面这样的输出或像我现在编辑的上面那样的输出.. . 会话,用户平均速率(bps),用户平均速率(bps) 43 17104773 247272821

以上是关于Python脚本从文本文件grep字段并将输出写入csv文件的主要内容,如果未能解决你的问题,请参考以下文章

从 zip 文件中读取文件并将其写入另一个文件时面临的问题

用于从文本日志文件中提取/检索值的 Shell 脚本(sqlcode 字段值)

如何将 websocket 推送 api 输出写入文本文件?

Python删除重复项并将其写入新文件

Cron作业无法执行写入文本文件的python脚本

Grep 命令问题 - 来自程序输出的 Grep 文本?