python处理百度统计csv数据

先吐槽一下辣鸡百统...太难用了。

然后进入正题


业务需求主要分2类:urls,events

百统选中日期段时,导出csv文件会将时间段内的所有数据合并;

业务场景对数据的处理通常以自然日为单位;

于是只能每天导出1份csv文件。

但是这样导出的文件,首列为序号1,2,3,4,不包含日期。

例如:


 事件类型事件总数唯一访客事件数事件价值
 总计456
1a123
2b123
3c123


期望转制成


日期事件类型事件总数唯一访客事件数事件价值平均价值
20170822总计4560
20170822a1230
20170822b1230
20170822c1230



主要需求:

匹配指定文件

为首列写入日期

输出



Events部分


文件命名格式

事件统计_yyyymmdd-yyyymmdd.csv


1.

新建python文件csvtool.py

定义一个输出方法

#!/usr/bin/python
#-*- coding:UTF-8 -*-
#python2.7

import csv  #读写csv
import re   #匹配文件名
import os   #计算path
import sys  #设定默认编码


def csv_writer(filepath, lists, fileheader):
    #命中目标文件
    csvFile = open(filepath,'w')  # encoding='utf-8'
    writer = csv.writer(csvFile)
    # 写入内容
    if fileheader:
        writer.writerow(fileheader)
    for item in lists:
        writer.writerow(item)
    csvFile.close()


由于首次转制,数据较多,合并到同一个csv中输出,比较容易导入mysql


def collect_csvs(resource,target):  #合并csv文件为1个
    print(resource)
    if os.path.isdir(resource):  # 检验目录是否有误
        print ("Resource dir exists!")
    else:
        print ("Resource dir not exists")
        exit()

    result = [] #收集csv数据
    fileheader = [] #定义csv文件头,可选
    filelists = os.listdir(resource)
    for file in filelists:
        tt_match = re.search(r'_(.+?)-', file) #输入正则匹配需要的文件名
        if tt_match:
            print("===start proceed " + file + "===")
            # 获取日期
            key = tt_match.group(1)    #根据正则获取到的关键命名词
            print("====rename key is " + key + " ===")
            # 开始读取file
            csvfile = open(os.path.join(resource, file), 'r')
            reader = csv.reader(csvfile)
            index = 1
            # 获取file中的数据
            for item in reader:
                # 第一行为列头
                if reader.line_num == 1:
                    print("===item1 is " + str(item) + " ===")
                    fileheader = item
                    s = u'日期'
                    fileheader[0] = s.decode('utf-8').encode('gb2312') #csv文件默认是acsii编码,中文环境下重encode为gb2312才不会乱码。
                    continue
                if item:  # 判断是否为空行 ,不能完全判断,部分空行为['','','','']
                    index = index + 1
                    item[0] = key  # 按需在首列填充关键词
                    result.append(item)  # 写入数组
            print("===total " + str(index) + " items comopleted")
            # 关闭file
            csvfile.close()
            print("=====" + file + " close======")
    # 开始重写csv
    csv_writer(os.path.join(target, key + ".csv"), result, fileheader)
    print("===" + key + ".csv completed===")




2.定义好方法后,调用


reload(sys)
sys.setdefaultencoding('utf-8')
print(sys.getdefaultencoding())


resource = "/home/ubuntu/csvtool/source/" #文件目录
target = "/home/ubuntu/csvtool/target/" #输出目录


collect_csvs(resource,target)
print("===Congratulations! collect_csvs is compeleted smoothly===")




这样所有resource目录下的*.csv都会合并到最后的key.csv中,用mysql自带的csv导入工具即可完成任务。



3.

后续维护时,每日只有1张基础event表,不需要做批量合并,可以采用1对1转制方法,规范命名、存档。


def change_csvs(resource,target):   #将csv文件1对1重写成另外一批csv文件
    if os.path.isdir(resource):  # 检验目录是否有误
        print ("Directory exists!")
    else:
        print ("Directory not exist.")
        time.sleep(5)
        exit()

    filelists = os.listdir(resource)
    for file in filelists:
        tt_match = re.search(r'_(.+?)-', file) #输入正则匹配需要的文件名
        if tt_match:
            print("===start proceed " + file + "===")
            # 获取日期
            key = tt_match.group(1)    #根据正则获取到的关键命名词
            print("====rename key is " + key + " ===")
            # 开始读取file
            result = []  # 收集csv数据,先重置
            csvfile = open(os.path.join(resource, file), 'r')
            reader = csv.reader(csvfile)
            index = 1
            # 获取file中的数据
            for item in reader:
                # 写入第一行为列头
                if reader.line_num == 1:
                    print("===item1 is " + str(item) + " ===")
                    fileheader = []  # 定义csv文件头,可选
                    fileheader = item
                    s = u'日期'
                    fileheader[0] = s.decode('utf-8').encode('gb2312') #csv文件默认是acsii编码
                    # print("=====headers = " + fileheader[0] + " ======")
                    continue
                if item:  # 判断是否为空行 ,不能完全判断,部分空行为['','','','']
                    index = index + 1
                    item[0] = key  # 按需在首列填充关键词
                    result.append(item)  # 写入数组
            print("===total " + str(index) + " items comopleted")
            # 开始重写csv
            csv_writer(os.path.join(target, key + ".csv"), result, fileheader)
            print("===" + key + ".csv completed===")
            # 关闭file
            csvfile.close()
            print("=====" + file + " close======")




然后写入


resource = "/home/ubuntu/csvtool/source/" #文件目录
target = "/home/ubuntu/csvtool/target/" #输出目录


change_csvs(resource,target)
print("===Congratulations! change_csvs is compeleted smoothly===")

这样所有   yyyymmdd-yyyymmdd.csv都会被重写成 yyyymmdd.csv




4.优化

其实导出的csv中,列名不是必须的,预先在数据库中设计好表,可以省去列名;

对多个网站做数据管理时,输出文件名需要为 网站名称_yyyymmdd.csv,不然会混乱;

其实完全可以直接在python中conn数据库然后写入数据,不需要导出csv再手动转入【单纯想练手......



urls部分再补。



说到这里就想吐槽一个无脑的可视化工具bdp,号称个人版免费,支持一大堆常用数据源等。

使用一段时间后被迫放弃。

比如如链接友盟,经常有数据丢失,比如07.01-08.31,中间莫名丢失几天的数据。

再比如不支持百统的事件统计。

比如链接百统的urls表时,筛选关键词出来的浏览数据会<<百统后台直接搜索。

比如...

一开始完全没有察觉,结果用了好久才有种上当的感觉。回头看以前的报表几乎满满都是坑。

虽然百统自己本身也是完全不准确的,经常出现子方法uv>>父事件等......



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值