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 相关文章推荐
linux系统使用python获取cpu信息脚本分享
Jan 15 Python
用Python实现一个简单的线程池
Apr 07 Python
wxPython中listbox用法实例详解
Jun 01 Python
全面了解Python的getattr(),setattr(),delattr(),hasattr()
Jun 14 Python
Python编写一个优美的下载器
Apr 15 Python
python实现超市扫码仪计费
May 30 Python
python的concat等多种用法详解
Nov 28 Python
Python list列表中删除多个重复元素操作示例
Feb 27 Python
Python3.7 pyodbc完美配置访问access数据库
Oct 03 Python
sklearn和keras的数据切分与交叉验证的实例详解
Jun 19 Python
python读取图片颜色值并生成excel像素画的方法实例
Feb 19 Python
python基础之文件操作
Oct 24 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
Apache, PHP在Windows 9x/NT下的安装与配置 (一)
2006/10/09 PHP
php 8小时时间差的解决方法小结
2009/12/22 PHP
PHP中获取变量的变量名的一段代码的bug分析
2011/07/07 PHP
通过Email发送PHP错误的方法
2015/07/20 PHP
PHP和Mysql中转UTF8编码问题汇总
2015/10/10 PHP
浅谈PHP错误类型及屏蔽方法
2017/05/27 PHP
laravel 框架实现无限级分类的方法示例
2019/10/31 PHP
CSS+Table图文混排中实现文本自适应图片宽度(超简单+跨所有浏览器)
2009/02/14 Javascript
jQuery取得select选择的文本与值的示例
2013/12/09 Javascript
使用Nodejs开发微信公众号后台服务实例
2014/09/03 NodeJs
JavaScript中的object转换成number或string规则介绍
2014/12/31 Javascript
javascript与Python快速排序实例对比
2015/08/10 Javascript
el表达式 写入bootstrap表格数据页面的实例代码
2017/01/11 Javascript
js实现本地时间同步功能
2017/08/26 Javascript
浅谈Angular单元测试总结
2019/03/22 Javascript
基于Vue 撸一个指令实现拖拽功能
2019/10/09 Javascript
JS实现表单中点击小眼睛显示隐藏密码框中的密码
2020/04/13 Javascript
[01:33:07]VGJ.T vs Newbee Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
Python文件操作类操作实例详解
2014/07/11 Python
python执行get提交的方法
2015/04/29 Python
python使用clear方法清除字典内全部数据实例
2015/07/11 Python
查看python下OpenCV版本的方法
2018/08/03 Python
利用matplotlib实现根据实时数据动态更新图形
2019/12/13 Python
Python hashlib模块实例使用详解
2019/12/24 Python
Python3 assert断言实现原理解析
2020/03/02 Python
css3利用transform变形结合事件完成扇形导航
2020/10/26 HTML / CSS
html5新增的属性和废除的属性简要概述
2013/02/20 HTML / CSS
Gap工厂店:Gap Factory
2017/11/02 全球购物
马来西亚与新加坡长途巴士售票网站:BusOnlineTicket.com
2018/11/05 全球购物
美国婴儿用品及配件购买网站:Munchkin
2019/04/03 全球购物
Currentbody西班牙:美容仪专家
2019/09/28 全球购物
什么是设计模式
2012/06/17 面试题
2015年初中教师个人工作总结
2015/07/21 职场文书
服务行业标语口号
2015/12/26 职场文书
2016道德模范先进事迹材料
2016/02/26 职场文书
2016年教师师德师风承诺书
2016/03/25 职场文书