• 背景:

    • A、B2个IDC,A地全为windows服务器(游戏业务);B地为linux(数据统计、充值、站点业务)
    • A地每个区服每天运行会产生很多日志,为玩家账号数据变动信息(装备更新、角色属性等)
    • 需要将A地日志拉倒B地进行报表输出后给运营团队分析
  • 奇葩点:

    • 游戏业务团队只提供FTP(真TM安全),余事不管
    • 日志为GBK,OS、DB、APP处理的都是utf8,so不能通过shell来处理,且不同名称日志导入不同表中...
    • 时间紧急,早上的需求下午就要看报表(想什么来什么.....)
  • 思路:

    • 用python(写的是脚本,连对象都不要),先不管性能,先实现功能后后续优化
  • 姿势上码:
  •   1 #!/usr/bin/env python
      2 # -*- coding:utf-8 -*-
      3 # author: qiaogy
      4
      5 from ftplib import FTP
      6 import os
      7 import sys
      8 import shutil
      9 import subprocess
     10 import zipfile
     11
     12
     13 root = os.path.dirname(os.path.abspath(__file__))
     14 sys.path.append(root)
     15
     16 dest_dir = []  # 要处理的日志目录
     17 table_dic = {
     18     '01': 'gamereport.tb_game_detail_info_30012_1_01"',
     19     '02': 'gamereport.tb_game_detail_info_30012_1_02"',
     20     '03': 'gamereport.tb_game_detail_info_30012_1_03"',
     21     '04': 'gamereport.tb_game_detail_info_30012_1_04"',
     22     '05': 'gamereport.tb_game_detail_info_30012_1_05"',
     23     '06': 'gamereport.tb_game_detail_info_30012_1_06"',
     24     '07': 'gamereport.tb_game_detail_info_30012_1_07"',
     25     '08': 'gamereport.tb_game_detail_info_30012_1_08"',
     26     '09': 'gamereport.tb_game_detail_info_30012_1_09"',
     27     '10': 'gamereport.tb_game_detail_info_30012_1_10"',
     28     '11': 'gamereport.tb_game_detail_info_30012_1_11"',
     29     '12': 'gamereport.tb_game_detail_info_30012_1_12"',
     30 }
     31
     32
     33 # 登陆
     34 ftp = FTP('x.x.x.x')
     35 ftp.login('qiaogy', 'x.x.x.x')
     36 ftp.cwd('/chuanqi/lxtx1qu')
     37
     38 # 创建 zip 归档下载目录
     39 zip_dir = os.path.join(root, 'zip_dir')
     40 if not os.path.exists(zip_dir):
     41     os.mkdir(zip_dir)
     42
     43
     44 # 求差集,避免下载已经处理过得zip包
     45 already_zip = os.listdir(zip_dir)
     46 des_zip_dir = ftp.nlst()
     47 for item in already_zip:
     48     if item in des_zip_dir:
     49         des_zip_dir.remove(item)
     50
     51 # 从ftp下载 zip文件,放入 zip_dir
     52 for file in des_zip_dir:
     53     if file.endswith('.zip'):
     54         dest_file = os.path.join(zip_dir, file)
     55         ftp.retrbinary('RETR {}'.format(file), open(dest_file, 'wb').write)
     56         print('download cucess:{} '.format(file).center(50, '='))
     57         # 从zip_dir 解压至根目录下
     58         z = zipfile.ZipFile(dest_file, 'r')
     59         z.extractall(path=root)
     60
     61
     62
     63
     64
     65 # 找到指定目录['2016-08-30', '2016-08-31'], 只要是以指定格式开头的都算
     66 for file in os.listdir(root):
     67     if file.startswith('2016'):
     68         dest_dir.append(file)  # 以2016开头的所有文件
     69
     70
     71 # 创建转码后的目录    utf8/utf8.2016-08-30
     72 for dir_name in dest_dir:
     73     utf8_root = os.path.join(root, 'utf8')
     74     utf8_dir = os.path.join(utf8_root, 'utf8.' + dir_name)
     75     if os.path.exists(utf8_root):
     76         if not os.path.exists(utf8_dir):
     77             os.mkdir(utf8_dir)
     78         else:
     79             print(utf8_dir, 'already exsit')
     80     else:
     81         os.mkdir(utf8_root)
     82         os.mkdir(utf8_dir)
     83
     84
     85
     86 # 转码后保存至 utf8/utf8.2016-08-30/filename-utf8
     87 for dir_name in dest_dir:
     88     print('begin to update DB ,dir is {}'.format(dir_name).center(50, '='))
     89     dir_abs = os.path.join(root, dir_name)
     90     for file in os.listdir(dir_abs):
     91         logfile_abs = os.path.join(dir_abs, file)
     92         utf8_file = os.path.join(root, utf8_dir, file+'-utf8')
     93         if os.path.exists(utf8_file):
     94             print('utf8 file already exists')
     95             continue
     96         with open(logfile_abs, 'r', encoding='GBK') as f1, open(utf8_file, 'w', encoding='utf-8') as f2:
     97             for line in f1:
     98                 f2.write(line)
     99
    100         # 开始导入数据
    101         sql_file = '\'' + utf8_file + '\''
    102         table = table_dic.get(dest_dir[0][5:7])
    103         sql_cmd = 'mysql -h127.0.0.1 --local-infile -uroot -p\'redhat123\' -e "load data local infile '\
    104                   + sql_file + ' into table ' + table
    105         obj = subprocess.Popen(sql_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    106         stdout_data, stderro_data = obj.communicate()
    107
    108         if len(stdout_data) == 0:
    109             print('sql load data ok, file:{}'.format(utf8_file))
    110         else:
    111             print('sql load error, file:{}'.format(utf8_file))
    112
    113     else:
    114         print('sql update cuccess:{}'.format(dir_name).center(50, '='))
    115
    116 # 清除解压后的目录
    117
    118 for name in dest_dir:
    119     shutil.rmtree(name)
    120     print('{} dir cleand'.format(name).center(50, '='))

转载于:https://www.cnblogs.com/qiaogy/p/5841514.html

奇葩的报表(连更-对,昨天发生大事了。。。。)相关推荐

  1. 哪款报表工具更适合行业软件开发商?

    行业软件开发商(以下简称开发商)是我国最常见的软件公司了,其本身具备较强的技术能力,而且每年都会承接很多项目,在选择报表工具时的关注点与技术能力不强(大部分).且在较长时间内只选购一次产品的行业终端用 ...

  2. 又见奇葩乘客!醉酒男子与人发生冲突迫使飞机返航

    中新网1月22日电 据澳大利亚新快网报道,当地时间21日,一个从澳大利亚昆士兰州飞往新加坡的航班在起飞仅1小时20分钟后,有一名醉酒男乘客与机上其他乘客发生冲突,导致该航班被迫返回,随后男子被交由警方 ...

  3. FineReport 11.0 五大全新功能,让报表开发更快、更好看

    在FineReport 11.0 剧透中,大师兄给大家预告了很多亮点功能!布局推荐.复用组件.主题切换等功能对应的痛点场景更是引起了超多的共鸣! 这些让我们困扰已久的问题,在 FineReport 1 ...

  4. 导出excel 数据取一次合理还是分页取合理_一张报表模板替代数百张Excel表格,用它让报表工作更轻松...

    要问现代职场人,必备工作技能是什么?Excel技能当仁不让,数据分析.总结汇报.信息传达,统统离不开.但是在日常工作中,Excel也有着它的局限性,以月度数据汇报为例,每月都需重新做表统计,其实内容还 ...

  5. 关于昨天发生的卫星逼近空间站的事情

    昨天看到消息说两颗美国卫星逼近了中国空间站,我空间站被迫进行了避让,当时还不知道这就是星链计划的卫星之一,今天看到了确切消息,我有了下面的话. 特别想由衷的说一句话,有些马吹就不要再吹了,什么人类之星 ...

  6. PPT丑哭了?这个工具做报表上手更简单,效果更酷炫,送40套模板

    如果2023年你还做着万年不变的饼图.折线图,你将会再次错失涨薪的机会! 数据有多重要,已经不言而喻,随之而来的是职场对数据分析与展示能力的要求也越来越高. 但是你是不是这种情况?一用图表就只会用饼图 ...

  7. 报表控件ActiveReports设计器,让报表开发更简单

    ActiveReports是一款专注于 .NET 和 .NET Core 平台的报表控件.通过拖拽式报表设计器,可以快速地设计 Excel表格.Word文档.图表.数据过滤.数据钻取.精准套打等类型报 ...

  8. 数据可视化demo_为更快读懂报表,我们将数据可视化了

    将数据可视化后,即使是复杂难懂的数据也会瞬间变得简单易懂,难就难在怎么快速将海量数据中的复杂数据信息提取,不同场景下该用那种方式展示数据更直观易懂.而这些,在奥威BI数据可视化软件上都有了答案. 在常 ...

  9. 用BI报表来做预算,更有说服力

    下一年的预算能不能顺利批下来,能不能确保重要的几个项目预算不被砍?那就得将预算分析做得直观易懂,将投入和回报分析做得更细致,让管理决策者看到该预算的合理性.必要性.如何才能让预算分析报表更简单明了,让 ...

最新文章

  1. R语言进行dataframe数据左连接(Left join):使用R原生方法、data.table、dplyr等方案
  2. 【学习笔记】redis一些配置文件参数详解
  3. Acwing 252. 树 点分治
  4. [导入]写了个img2ppt的demo,为写PDF2PPT做准备
  5. BigNums 之 hdu 1753
  6. 面试官:谈谈 Tomcat 架构及启动过程,我一脸懵逼。。
  7. 丹纳赫:全球实业型赋能投资标杆
  8. 历史 微信开发者工具_微信开发者工具-微信开发者工具下载 v1.03.2011120官方版--pc6下载站...
  9. 163 镜像源 linux,网易163的Ubuntu apt镜像源
  10. CMOS与TTL(下)
  11. 使用计算机VLOOKUP函数需注意什么,lookup和vlookup的区别 计算机Excel中的lo...
  12. 华硕台式计算机光盘怎么启动不了,华硕台式机U盘启动不了怎么回事
  13. 凹点匹配 matlab源码,粘连类圆形目标图像的分割方法与流程
  14. 深刻理解:无人机数据系统应用
  15. 【句库】英语论文写作之好词好句积累
  16. 安卓手机云控系统框架源码,PHP+Autojs, ,这套是空框架源码
  17. 全网最全AD16——原理图绘制
  18. 什么是手机号码姓名实名认证 手机号码查姓名 手机号实名认证API
  19. 深入浅出内存马(一)
  20. 计算机软件研究方法与技术路线,开题报告研究方法与技术路线.doc

热门文章

  1. .NET分布式缓存Memcached测试体验
  2. WebUI中DataGrid多层表头的终极解决办法
  3. python代码优化_Python 代码优化技巧(一)
  4. mysql与ms sql server_MS SQL Server和MySQL区别
  5. html中怎么实现广告自动出来又自动隐藏?,基于jquery实现的定时显示与隐藏div广告的实现代码...
  6. linux 重新分区挂载,Linux:挂载磁盘分区,linux已挂载磁盘重新分区
  7. 8086 c语言,2016年上海大学机电工程与自动化学院微机硬件及软件(包含8086微机和C语言)之C程序设计考研复试题库...
  8. 要了薪资证明了录取的几率大吗_空乘专业的录取分数线是多少?
  9. C++编程进阶1(对于单纯的常量,用const替换#define、operator[]与const)
  10. 插值算法C实现(一元全区间)