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 相关文章推荐
python写的ARP攻击代码实例
Jun 04 Python
python实现从字符串中找出字符1的位置以及个数的方法
Aug 25 Python
用python读写excel的方法
Nov 18 Python
python常规方法实现数组的全排列
Mar 17 Python
使用Python下载歌词并嵌入歌曲文件中的实现代码
Nov 13 Python
python爬虫入门教程--HTML文本的解析库BeautifulSoup(四)
May 25 Python
Python数据结构之单链表详解
Sep 12 Python
Python实现爬虫从网络上下载文档的实例代码
Jun 13 Python
python将四元数变换为旋转矩阵的实例
Dec 04 Python
使用TensorFlow搭建一个全连接神经网络教程
Feb 06 Python
python logging设置level失败的解决方法
Feb 19 Python
python的setattr函数实例用法
Dec 16 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 按指定元素值去除数组元素的实现方法
2011/11/04 PHP
PHP独立Session数据库存储操作类分享
2014/06/11 PHP
php 无限分类 树形数据格式化代码
2016/10/11 PHP
PHPCMS手机站伪静态设置详细教程
2017/02/06 PHP
php实现微信公众号企业转账功能
2018/10/01 PHP
JQuery从头学起第一讲
2010/07/04 Javascript
Jquery知识点二 jquery下对数组的操作
2011/01/15 Javascript
关于onScroll事件在IE6下每次滚动触发三次bug说明
2011/09/21 Javascript
jQuery实现不断闪烁文字的方法
2015/05/15 Javascript
js格式化输入框内金额、银行卡号
2016/02/01 Javascript
Vue.js一个文件对应一个组件实践
2016/10/27 Javascript
JavaScript省市级联下拉菜单实例
2017/02/14 Javascript
JavaScript中object和Object的区别(详解)
2017/02/27 Javascript
JavaScript实现的原生态兼容IE6可调可控滚动文字功能详解
2017/09/19 Javascript
JavaScript体验异步更好的解决办法
2018/01/08 Javascript
浅谈webpack4 图片处理汇总
2018/09/12 Javascript
vue使用axios上传文件(FormData)的方法
2019/04/14 Javascript
Javascript类型判断相关例题及解析
2020/08/26 Javascript
element中table高度自适应的实现
2020/10/21 Javascript
python根据时间生成mongodb的ObjectId的方法
2015/03/13 Python
Python多线程爬虫简单示例
2016/03/04 Python
Python内建模块struct实例详解
2018/02/02 Python
Python使用Pickle库实现读写序列操作示例
2018/06/15 Python
Python3获取拉勾网招聘信息的方法实例
2019/04/03 Python
python sorted函数的小练习及解答
2019/09/18 Python
使用Fabric自动化部署Django项目的实现
2019/09/27 Python
Pycharm Available Package无法显示/安装包的问题Error Loading Package List解决
2020/09/18 Python
PyCharm 解决找不到新打开项目的窗口问题
2021/01/15 Python
戴尔美国官网:Dell
2016/08/31 全球购物
金讯Java笔试题目
2013/06/18 面试题
STP的判定过程
2012/10/01 面试题
创业者迈进成功第一步:如何写创业计划书?
2014/03/22 职场文书
法学专业毕业生自荐信
2014/06/11 职场文书
sqlserver2017共享功能目录路径不可改的解决方法
2021/04/16 SQL Server
php中配置文件保存修改操作 如config.php文件的读取修改等操作
2021/05/12 PHP
MySQL创建管理RANGE分区
2022/04/13 MySQL