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。
我正在编写一个 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。