python

本文介绍了一个Python脚本,该脚本用于处理HadoopLoader生成的CSV文件,包括文件名生成、数据读取及筛选特定文件后缀的数据行,并进一步处理这些数据行以生成新的文本文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#!/usr/bin/python
#  _*_ coding: utf-8 _*_
#  hadooploader csv File check
import time, datetime
import socket
import os
import io






def  rwfilename():
    ###拼接要扫描的csv名称
    ###将文件读取到list中保存,待用
    ###获取当前时间
    ticks = time.time()
    ###拼接要扫描的csv名称
    day = time.strftime("%Y%m%d", time.localtime())
    localtime = str(day)
    hour = time.strftime("%H", time.localtime())
    ###小时数减1,表示查询前一小时的文件
    hour1 = int(hour) - 1
    #print(hour1)
    if hour1<10 :
        starthour = localtime + "0"+ str(hour1) + "00"
    else:
        starthour = localtime + str(hour1) + "00"
    if int(hour)<10:
        endhour = localtime +"0"+ str(int(hour)) + "00"
    else:
        endhour = localtime +  hour + "00"
    ###定义一个全局的变量传递csv文件名称
    global name1
    ###最后要扫描的文件名
    name1 = ("Hadooploader_" + starthour + "-" + endhour + ".csv")
    #
    print(name1)
    ###调用cfilename(),拿到要扫描的文件名称
    ###resultlegth,用于计数器,表示最后有多少行满足条件的总数
    resultlegth = 0
    ### 获取本机电脑名
    global host_name
    host_name = socket.getfqdn(socket.gethostname())
    ### 获取本机的IP
    global host_ip
    host_ip = socket.gethostbyname(host_name)
    #   with open('E:\Hadooploader_201611281000-201611281100.csv') as csvfile:
    ###文件流打开
    global fname
    fname1 = "/home/hadoop-loader/log/record/" + name1
    print(fname1)
    if os.path.exists(fname1):
        fname = fname1
    else:
        fname = "/home/hadoop-loader/log/data_bak/" + name1
    #fname = 'E:\Hadooploader_201612051600-201612051700.csv'
    ###判断是否有前一小时的csv文件,没有则不进行任何操作
    print(fname)
    global keylist
    keylist =[]
    if os.path.exists(fname):
        file = open(fname)
        ###逐行读取
    #Hadooploader_201612060800-201612060900.csv
        line = file.readline()
        ###listcsv用于存取读取到的所有记录的二维列表,子元素为单行的内容
        global listcsv
        listcsv = []
        ###用于存储分割前包含filename所在的记录
        linestr = []
        while line != '':
            listcsv.append(line.split(","))
            line = file.readline()
        #print(listcsv)
        ###这个循环用于计数,求得满足条件的行数,创建最后保存结果的二维列表
        ###文件流关闭操作。
        file.close()


        resultlegth = 0
        for i in range(len(listcsv)):
            #print(i)
            ### 取得filename
            linestr = str(listcsv[i]).split(",")
            # print(linestr)
            csv1 = str(linestr[0])
            csv2 = csv1[2:len(csv1) - 1]
            # print(csv2)
            csv2length = len(csv2)
            # print("###############")
            ###取得文件后缀名
            endword = csv2[csv2length - 3:csv2length]


            if endword == "dat":
                keylist.append(i)
                resultlegth = resultlegth + 1


                # print(resultlegth)
        ###最后保存结果的二维列表
                #print(keylist)
                #print(len(keylist))
                #print(resultlegth)
        if len(keylist) > 0:
            if resultlegth >1000:
                if (resultlegth/1000)>int(resultlegth/1000) :
                    txtfilenum = int(resultlegth/1000) +1
                else:
                    txtfilenum = int(resultlegth/1000)
                if txtfilenum >16:
                    if (txtfilenum/16)>int(txtfilenum/16):
                        dirnum = int(txtfilenum/16) +1
                    else:
                        dirnum = int(txtfilenum / 16)
                else:
                    dirnum =1
            else:
                txtfilenum = 1
                dirnum = 1
                #print("******************")
                # print(resultlegth)
            print(txtfilenum)
                #print(dirnum)
                #print("******************")
            for i in range(resultlegth):
                ti = int(keylist[i])
                linestr = str(listcsv[ti]).split(",")
                csv1 = str(linestr[0])
                csv2 = csv1[2:len(csv1) - 1]
                # print(csv2)
                csv2length = len(csv2)
                csv3 = csv2.split("/")
                # print(csv3)
                length1 = len(csv3)
                csv4 = csv3[length1 - 1]
                # print(csv4)
                ###拼接出filename
                ##filename = csv3[length1 - 4] + "_" + csv3[length1 - 3] + "_" + csv3[length1 - 2] + "_" + csv3[length1 - 1]
                filename = csv4
                # print(filename)
                ### 取得文件大小
                filesizestr = linestr[2]
                filesize = int(filesizestr[2:len(filesizestr) - 1])
                ### 获取clltime
                clttimestr = linestr[3]
                clttime = clttimestr[2:len(clttimestr) - 5]
                clttime1 = clttimestr[2:len(clttimestr) - 1]
                ctime = datetime.datetime.strptime(clttime, "%Y-%m-%d %H:%M:%S")
                ctime1 = datetime.datetime.strptime(clttime1, "%Y-%m-%d %H:%M:%S:%f")
                ### 获取endtime
                endtimestr = linestr[4]
                endtime1 = endtimestr[2:len(endtimestr) - 4]
                endtime = endtimestr[2:len(endtimestr) - 8]
                etime = datetime.datetime.strptime(endtime, "%Y-%m-%d %H:%M:%S")
                etime1 = datetime.datetime.strptime(endtime1, "%Y-%m-%d %H:%M:%S:%f")
                duration = int(((etime1 - ctime1).microseconds) / 1000 + ((etime1 - ctime1).seconds) * 1000)
                #print(filesize)
                #print(i)
                #print(duration)
                dirnum1 = int(i/1000/16) +1
                txtfilenum1 = int(i / 1000)
                if txtfilenum1 % 16 ==0 and txtfilenum1 != 0:
                    txtfilenum2 = 16
                else:
                    txtfilenum2 =(txtfilenum1%16) + 1
                nowtime = datetime.datetime.now()
                ###当前小时数
                nowh = int(nowtime.strftime("%H"))
                nowm = int(nowtime.strftime("%M")) + 1 +txtfilenum2
                if nowm >= 60:
                    nowm = nowm - 60
                    nowh = nowh + 1
                if int(nowm) < 10:
                    nowm = "0" + str(nowm)
                if nowh < 10:
                    nowh = "0" + str(nowh)
                dirname = "/home/vmax-saltagent/sample/HOST_Manager/hadoopload" + str(dirnum1) +"/"
                txtfilename = "file_integrity_hadooploader_" + str(nowh) + "_" + str(nowm) + ".txt"
                lastname = dirname + txtfilename
                if not os.path.exists(dirname):  ###判断文件是否存在,返回布尔值
                    os.mkdir(dirname)
                if i % 1000 ==0:
                    if not os.path.exists(dirname):  ###判断文件是否存在,返回布尔值
                        os.mkdir(dirname)
                    txtfilename1 = lastname
                    print(i)
                    print(txtfilename1)
                    ###打开文件写入流
                    ###打开文件写入流
                    fileopen1 = open(txtfilename1, 'a')
                    ###写入第一行,字段名称
                    fileopen1.write(
                        "host_name" + "\t" + "host_ip" + "\t" + "module_name" + "\t" + "proc_name" + "\t" + "clttime" + "\t" + "duration" + "\t" + "destip" + "\t" + "filename" + "\t" + "filesize" + "\t" + "gentime" + "\t" + "overtime" + "\t" + "load_result" + "\t" + "error_info" + "\n")
                    ###将结果循环写到生成的txt文件中去


                    fileopen1.close()                   
                fileopen = open(lastname, 'a')
                fileopen.write(host_name + "\t")
                fileopen.write(host_ip + "\t")
                fileopen.write("Hadooploader" + "\t")
                fileopen.write("hadooploader" + "\t")
                fileopen.write(endtime + "\t")
                fileopen.write(str(duration) + "\t")
                fileopen.write("null" + "\t")
                fileopen.write(filename + "\t")
                fileopen.write(str(filesize) + "\t")
                fileopen.write(endtime + "\t")
                fileopen.write("0" + "\t")
                fileopen.write(str(1) + "\t")
                fileopen.write("upload success" + "\n")

                fileopen.close()
rwfilename()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值