python 解决动态的定义变量名,并给其赋值的方法(大数据处理)


Posted in Python onNovember 10, 2018

最近消费kafka数据到磁盘的时候遇到了这样的问题:

需求:每天大概有1千万条数据,每条数据包含19个字段信息,需要将数据写到服务器磁盘,以第二个字段作为大类建立目录,第7个字段作为小类配合时间戳作为文件名,临时文件后缀tmp,当每个文件的写入条数(可配置,比如100条)达到要求条数时,将后缀tmp改为out。

问题:大类共有30个,小类不计其数而且未知,比如大类为A,小类为a,时间戳为20180606095835234,则A目录下的文件名为20180606095835234_a.tmp,这样一来需要在此文件写满100条时,更新时间戳生成第二个文件名,如果此时有1000个文件都在写则需要有1000个时间戳,和1000个计数器记录每个文件当前的条数,如果分别定义1000个变量显然是不划算的,

尝试:中间过程想到了动态定义变量名,即

定义第七个字段:seven = data.split('|')[7]

定义文件名:filename = time_stamp + '_' + seven+'.tmp',

定义文件计数器:seven + ‘_num' = 0

定义文件时间戳:seven + '_stamp' = time.time( )

想法其实是没问题的,但是这里用到了一个不常用的语法:用一个变量名和一个字符串拼接出来一个新的变量名,并继续赋值(不知道我的表述是否清楚),试过了用local()函数、global()函数、exec()函数都没有达到预期效果,也许是把问题想的太复杂了

解决:最后使用三个字典将这个问题完美解决,

定义一个字典用来存计数器,字典的每一个键对应一个文件名,值对应当前计数,并实时更新;

定义一个字典用来存时间戳,键对应一个文件名,值对应时间戳,达到100条就更新一次;

定义一个字典用来存大类,键对应代号,值对应分类;

局部功能代码如下:

def kafka_to_disk():
 print('启动前检测上次运行时是否存在意外中断的数据文件......')
 print('搜索最近一次执行脚本产生的时间目录......')
 # 待处理临时文件列表
 tmp_list = []
 try:
  for category_dir in os.listdir(local_file_path):
   if len(os.listdir(local_file_path+os.sep+category_dir)) > 0:
    for file in os.listdir(local_file_path+os.sep+category_dir):
     if suffix in file:
      tmp_list.append(local_file_path+os.sep+category_dir+os.sep+file)
  # print('上次运行程序产生的临时文件有---{}'.format(tmp_list))
 except Exception as e:
  pass
 if len(tmp_list) == 0:
  print('未扫描任何残留临时文件')
 else:
  print('开始修复残留临时文件......')
 tmp_num = 0
 for tmp in tmp_list:
  os.rename(tmp, tmp.split('.')[0]+'.out')
  tmp_num += 1
 print('本次启动共修复残留临时文件★★★★★-----{}个-----★★★★★'.format(tmp_num))
 
 category_poor = {
  '1': 'news', '2': 'weibo', '3': 'weixin', '4': 'app', '5': 'newspaper', '6': 'luntan',
  '7': 'blog', '8': 'video', '9': 'shangji', '10': 'shangjia', '11': 'gtzy', '12': 'zfztb',
  '13': 'gyfp', '14': 'gjz', '15': 'zfxx', '16': 'ptztb', '17': 'company', '18': 'house',
  '19': 'hospital', '20': 'bank', '21': 'zone', '22': 'express', '23': 'zpgw', '24': 'zscq',
  '25': 'hotel', '26': 'cpws', '27': 'gxqy', '28': 'gpjj', '29': 'dtyy', '30': 'bdbk'}
 
 time_stamp = utils.get_time_stamp() # 初始化毫秒级时间戳 : 20180509103015125
 consumer = KafkaConsumer(topic, group_id=group_id, auto_offset_reset=auto_offset_reset, bootstrap_servers=eval(bootstrap_servers))
 print('连接kafka成功,数据筛选中......')
 file_poor = {}       # 子类池用于文件计数器
 time_stamp_poor = {}     # 子类时间戳池,用于触发文件切换
 time_stamp = utils.get_time_stamp()  # 初始化毫秒级时间戳 :20180509103015125
 for message in consumer:
  # 提取第8个字段自动匹配目录进行创建
  if message.value.decode().split('|')[1] in category_poor:
   category = category_poor[message.value.decode().split('|')[1]]
  else:
   print(message.value.decode())
   continue
  category_dir = local_file_path + os.sep + category
  if not os.path.exists(category_dir):
   os.makedirs(category_dir)
  # 提取第2个字段,用于生成文件名
  if message.value.decode().split('|')[7] in time_stamp_poor:
   shot_file_name = time_stamp_poor[message.value.decode().split('|')[7]] + '_' + message.value.decode().split('|')[7]
  else:
   shot_file_name = time_stamp + '_' + message.value.decode().split('|')[7]
  file_name = category_dir + os.sep + shot_file_name + '.tmp'
 
  # 给每一个文件设定一个计数器
  if message.value.decode().split('|')[7] not in file_poor:
   file_poor[message.value.decode().split('|')[7]] = 0
 
  with open(file_name, 'a', encoding='utf-8')as f1:
   f1.write(message.value.decode())
   file_poor[message.value.decode().split('|')[7]] += 1
 
  # 触发切换文件的操作,用时间戳生成第二文件名
  if file_poor[message.value.decode().split('|')[7]] == strip_number:
   time_stamp_poor[message.value.decode().split('|')[7]] = utils.get_time_stamp()
   file_poor[message.value.decode().split('|')[7]] = 0

以上这篇python 解决动态的定义变量名,并给其赋值的方法(大数据处理)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
tornado框架blog模块分析与使用
Nov 21 Python
Python中文件I/O高效操作处理的技巧分享
Feb 04 Python
Python使用functools实现注解同步方法
Feb 06 Python
python中cPickle类使用方法详解
Aug 27 Python
Ubuntu18.04下python版本完美切换的解决方法
Jun 14 Python
详解pandas删除缺失数据(pd.dropna()方法)
Jun 25 Python
Python制作词云图代码实例
Sep 09 Python
查看端口并杀进程python脚本代码
Dec 17 Python
浅谈优化Django ORM中的性能问题
Jul 09 Python
Python3爬虫里关于识别微博宫格验证码的知识点详解
Jul 30 Python
关于python scrapy中添加cookie踩坑记录
Nov 17 Python
详解Python flask的前后端交互
Mar 31 Python
在Python中定义一个常量的方法
Nov 10 #Python
python 定义n个变量方法 (变量声明自动化)
Nov 10 #Python
浅谈python连续赋值可能引发的错误
Nov 10 #Python
Linux下安装python3.6和第三方库的教程详解
Nov 09 #Python
Python2和Python3.6环境解决共存问题
Nov 09 #Python
python3 面向对象__类的内置属性与方法的实例代码
Nov 09 #Python
python 不同方式读取文件速度不同的实例
Nov 09 #Python
You might like
php在字符串中查找另一个字符串
2008/11/19 PHP
PHP中怎样保持SESSION不过期 原理及方案介绍
2013/08/08 PHP
3款值得推荐的微信开发开源框架
2014/10/28 PHP
一款简单实用的php操作mysql数据库类
2014/12/08 PHP
php调用mysql存储过程实例分析
2014/12/29 PHP
yii框架redis结合php实现秒杀效果(实例代码)
2017/10/26 PHP
用JavaScript和注册表脚本实现右键收藏Web页选中文本
2007/01/28 Javascript
两种方法实现文本框输入内容提示消失
2013/03/17 Javascript
给超链接添加特效鼠标移动展示提示信息且随鼠标移动
2013/10/17 Javascript
jQuery操作input值的各种方法总结
2013/11/21 Javascript
JS通过ajax动态读取xml文件内容的方法
2015/03/24 Javascript
javascript单页面手势滑屏切换原理详解
2016/03/21 Javascript
NODE.JS跨域问题的完美解决方案
2016/10/20 Javascript
angularjs过滤器--filter与ng-repeat配合有奇效
2017/04/20 Javascript
vue实现分环境打包步骤(给不同的环境配置相对应的打包命令)
2019/06/04 Javascript
微信小程序 网络通信实现详解
2019/07/23 Javascript
Vue包大小优化的实现(从1.72M到94K)
2021/02/18 Vue.js
[02:10]三分钟回顾完美世界城市挑战赛
2019/01/24 DOTA
Python判断操作系统类型代码分享
2014/11/22 Python
python使用MySQLdb访问mysql数据库的方法
2015/08/03 Python
python编写简单爬虫资料汇总
2016/03/22 Python
Python 和 JS 有哪些相同之处
2017/11/23 Python
python用户管理系统的实例讲解
2017/12/23 Python
django传值给模板, 再用JS接收并进行操作的实例
2018/05/28 Python
基于scrapy的redis安装和配置方法
2018/06/13 Python
使用python将大量数据导出到Excel中的小技巧分享
2018/06/14 Python
python3.x提取中文的正则表达式示例代码
2019/07/23 Python
python 扩展print打印文件路径和当前时间信息的实例代码
2019/10/11 Python
python科学计算之narray对象用法
2019/11/25 Python
总经理职责
2013/12/22 职场文书
大学四年个人自我小结
2014/03/05 职场文书
暑期学习心得体会
2014/09/02 职场文书
领导班子奢靡之风查摆问题及整改措施
2014/09/27 职场文书
2014年德育工作总结
2014/11/20 职场文书
广告业务员岗位职责
2015/02/13 职场文书
根德5570型九灯四波段立体声收音机是电子管收音机的楷模 ? 再论5570
2022/04/05 无线电