今天分享又来了呀。ღ( ´・ᴗ・` ) 一起学习进步ღゝ◡╹)ノ♡

摘要:最近在开发etl工具,其中使用到了Python命令行编程,记录一下。

IMDG:

加油,好好学习,天天向上~

Q:

IMDG 重要性?

pycharm中用Terminal打开,这个目录就是项目所在的目录
D:\PythonCode\blibli\WorkTool>Python运行程序的指令
D:\PythonCode\blibli\WorkTool>python start.py传入第一个 参数指令
D:\PythonCode\blibli\WorkTool>python start.py hello

1 命令行编程

import sys
# 命令行编程
# 标准库 sys# 1构建程序的框架 增加一个info指令
print('wtt')
print(sys.argv)在终端中运行:
D:\PythonCode\blibli\WorkTool>python start.py
wtt
['start.py']D:\PythonCode\blibli\WorkTool>python start.py hello
wtt
['start.py', 'hello']   可以看见,这是一个列表,列表里面每个元素都是字符串。第一个元素是我们程序的名字。D:\PythonCode\blibli\WorkTool>python start.py hello word python
wtt
['start.py', 'hello', 'word', 'python']
import sys
# 命令行编程
# 标准库 sys# 1构建程序的框架 增加一个info指令
print('wtt')
print(sys.argv)
programName=sys.argv[0] #程序的名字,保存为一个变量
print(programName)终端执行:
D:\PythonCode\blibli\WorkTool>python start.py
wtt
['start.py']
start.py
# 工作情况分析import sys
# 命令行编程
# 标准库 sys# 1构建程序的框架 增加一个info指令
programName=sys.argv[0] #程序的名字,保存为一个变量if len(sys.argv) >1:pass
else:print("命令使用:")print("\tpython %s 命令[params]" % programName)
---------------------------------
D:\PythonCode\blibli\WorkTool>python start.py
命令使用:python start.py 命令[params]
# 工作情况分析
import sys
# 命令行编程
# 标准库 sys# 1构建程序的框架 增加一个info指令
programName = sys.argv[0]  # 程序的名字,保存为一个变量def do_info():'''info指令'''passif len(sys.argv) > 1:command = sys.argv[1]print("command = %s" % command)if command == "info":do_info()# 如果命令是info,我想调用函数,执行info要做的事情
else:print("命令使用:")print("\tpython %s 命令[params]" % programName)print("\tpython %s info" % programName)

start1.py

# 工作情况分析
import sys
import xlrd #读取excel的第三方库# 命令行编程
# 标准库 sys# 1构建程序的框架 增加一个info指令# 2给info指令增加第一个参数的实现,传入filepath;输出数据包含的月份信息def __loadWorkList(filePath): # 私有方法,读取我们的工作簿wb =xlrd.open_workbook(filename=filePath)sheet =wb.sheet_by_index(0) #打开第一个sheetres=[] # 我们要获得结果,结果应该是一个listfor i in range(sheet.nrows)[2:-1]:  #对列表进行切片。从第3行开始到倒数第二行。前面去掉2行,后面去掉一行#sheet.row_values(i) #获取每一行的值# print(sheet.row_values(i))res.append(sheet.row_values(i))return resdef do_info():"""info指令"""_help ='正确的指令输入格式: python %s info filepath' %programName  # 字符串,来提示用户输入正确的命令行格式if len(sys.argv) >2:  # 传入的第二个指令参数,我希望是程序的路径filePath = sys.argv[2]# print(filePath) # 这行是用来测试是否获取到传入的路径的res =__loadWorkList(filePath)# months= [r[3][:7] for r in res]  # 数据日期:2020-06,2020-06,2020-06,2020-06,2020-06,2020-06months= {r[3][:7] for r in res}  #数据日期: 2020 - 06   推导式写法,每一行拿出来,每一行都是一个列表。取出列表的第三项,截取第三项的前7位。外面符合是{},那就是集合推导式# print(months)   #['2020-06', '2020-06', '2020-06']   {'2020-06'}print('数据日期:'+','.join(months))   #字符串的join方法,将序列中的每一个元素用,拼接起来else:print(_help)programName=sys.argv[0]if len(sys.argv) > 1:command =sys.argv[1]# print('command =%s'%command)if command=='info':do_info()
else:print('命令使用方法:')print("\tpython %s COMMAND [PARAMS] " % programName)print("\tpython %s info " % programName)

学会封装函数,让每一个函数专注于某一项功能。

知道每个函数是用来解决什么问题的。

start2.py

时间戳 代表1970年1月1日0时,到现在这个时间的间隔秒数

# 工作情况分析
import sys
import xlrd
import re# 命令行编程# 1 构建程序的框架 增加一个info指令
# 2 给info指令增加第一个参数的实现, filepath命令行参数。输出数据包含的月份信息
# 3 给info指令增加第二个参数        month命令行参数。   规定格式:yyyy-mm格式的字符串  表示年和月 输出每个人工作统计结果def __loadWorkList(filePath):wb =xlrd.open_workbook(filename=filePath)sheet =wb.sheet_by_index(0)res=[]for i in range(sheet.nrows)[2:-1]:#print(sheet.row_values(i))res.append(sheet.row_values(i))return resdef calworktimes(date,begin,end):        # 3个形参和一个返回值"""函数逻辑:通过日期、签到、签退时间,计算当天的加班的分钟"""return 1def creatPersonData(filePath,month):res = __loadWorkList(filePath) # 读取内容之后,循环遍历文件的内容#首先要筛选,这个month的行res =[line for line in res if line[3][:7] ==month]  # 拿到Excel中 每一行的第三位元素(列) 截取前七位# print(res)username=None # 先把变量给定义出来,定义为临时变量user ={} # 用字典数据结构来保存这个人的信息userDataList=[] # 列表,存放所有人的记录for r in res:  # 遍历所有记录if username ==r[0]:  # 还是这个人  相同的姓名# 累计当前人的数据if r[8] =='正常' and r[9] =='正常':    # Excel中第8和9个元素(从0开始)  签到状态为‘正常’user ['zc'] =user ['zc']+1  # 正常 + 1else:user['qt'] = user['qt']+1  # 其他 +1# 没换人时,把数据给累积起来user ['addwork'] =user ['addwork'] +calworktimes(r[3],r[4],r[5])  # Excel处理加班时长   后面是个函数,加班时间和3个字段有关 日期、签到、签退  所以我们要传入这3个参数else:   # 换人了if username:   # 不是第一行的情况,才保存  等价于 if username !=None:userDataList.append(user)  # 保存   上一个人的数据  到列表中 。假如username是null,还是临时变量的时候,是不能够保存的# 初始化个人数据user ={'name':r[0],'zc':0,'qt':0,'addwork':0} # 人名 正常的天数 不正常天数 加班小时数         进行一个数据结构的封装username =r[0]for u in userDataList:print(u)def do_info():"""info指令"""_help ='请输入正确格式的指令: python %s info filePath [YYYY-MM]' %programNameif len(sys.argv) >2:filePath = sys.argv[2]if len(sys.argv)>3:  #输入的第3个命令行参数   info filePath monthmonth =sys.argv[3]print(month)# 统计每个人的工作数据    使用正则表达式来看看输入的参数是否满足格式的要求!if not re.match(r'^\d{4}-\d{2}$',month):   # 结果是false的情况下    检查月份的格式  \d表示一个数字 {4}重复4次print(_help) # 打印提示信息return # 程序一定要结束else:creatPersonData(filePath,month) # 函数   从filePath这个文件里读取month这个月份的数据else:res =__loadWorkList(filePath)months= {r[3][:7] for r in res}  # 推导式写法print('数据日期:'+','.join(months))else:print(_help)return #因为输出不符合我们的预期,我们一定要return来使程序结束programName=sys.argv[0]if len(sys.argv) > 1:command =sys.argv[1]# print('command =%s'%command)if command=='info':do_info()
else:print('命令使用方法:')print("\tpython %s COMMAND [PARAMS] " % programName)print("\tpython %s info FILEPATH [YYYY-MM] " % programName)

start3.py

import sys
import xlrd
import re
import datetime
# 命令行编程
# 标准库 sys# 1 构建程序的框架 增加一个info指令
# 2 给info指令增加第一个参数的实现, filepath输出数据包含的月份信息
# 3 给info指令增加第二个参数        month 是一个yyyy-mm格式的字符串表示年和月 输出每个人工作统计结果
# 4 完善加班时间统计的方法def __loadWorkList(filePath):wb = xlrd.open_workbook(filename=filePath)sheet = wb.sheet_by_index(0)res = []for i in range(sheet.nrows)[2:-1]:# print(sheet.row_values(i))res.append(sheet.row_values(i))return resdef calworktimes(date, begin, end):"""通过日期、签到、签退时间,计算当天的加班的分钟"""# 我们要知道这个日期是工作日还是休息日# 加上int(),把返回的字符串转换成整数week = int(datetime.datetime.strptime(date, '%Y-%m-%d').strftime('%w'))  # strptime()把字符串转换成时间戳,并且 转换成格式化时间   最后是转换成星期几,星期天是0  星期一是1minute = 0if 0 < week < 6:  # 周一到周五  也就是工作日if re.match(r'^\d{2}:\d{2}:\d{2}$', end):  # 判断时间格式是否正确b_time = datetime.datetime.strptime('17:30:00', '%H:%M:%S')  # 开始时间e_time = datetime.datetime.strptime(end, '%H:%M:%S')  # 结束时间if e_time > b_time:minute = (e_time - b_time).seconds // 60  # 拿到 加班的 间隔的秒数,除以60  拿到分钟else:  # 非工作日if re.match(r'^\d{2}:\d{2}:\d{2}$', begin) and re.match(r'^\d{2}:\d{2}:\d{2}$', end):  # 判断时间格式是否正确b_time = datetime.datetime.strptime(begin, '%H:%M:%S')e_time = datetime.datetime.strptime(end, '%H:%M:%S')if e_time > b_time:minute = (e_time - b_time).seconds // 60return minute  # 返回直接的加班时间# calworktimes('2020-07-31',None,None)
# sys.exit(0)def creatPersonData(filePath, month):res = __loadWorkList(filePath)res = [line for line in res if line[3][:7] == month]print(len(res))username = Noneuser = {}userDataList = []for r in res:  # 遍历所有记录if username == r[0]:  # 还是这个人# 累计当前人的数据if r[8] == '正常' and r[9] == '正常':user['zc'] = user['zc'] + 1else:user['qt'] = user['qt'] + 1user['addwork'] = user['addwork'] + calworktimes(r[3], r[4], r[5])else:  # 换人了if username:  # 不是第一行的情况,才保存userDataList.append(user)  # 保存上一个人的数据# 初始化个人数据user = {'name': r[0], 'zc': 0, 'qt': 0, 'addwork': 0}username = r[0]with open('data/' + month + '.txt', 'w') as df:  #保存下来,在当前目录下,子目录data,以month为名字的txt文件。覆盖内容w。for u in userDataList: # u 是一个对象,还不能直接往文件里写入。需要格式化下linestr = '{}|{}|{}|{}'.format(u['name'], u['zc'], u['qt'], u['addwork'])  # 用 |进行分割df.write(linestr + '\n') # 每行有换行符def do_info():"""info指令"""_help = '指令格式: python %s info FILEPATH [YYYY-MM]' % programNameif len(sys.argv) > 2:filePath = sys.argv[2]if len(sys.argv) > 3:month = sys.argv[3]# 统计每个人的工作数据if not re.match(r'^\d{4}-\d{2}$', month):  # 检查月份的格式print(_help)returnelse:creatPersonData(filePath, month)else:res = __loadWorkList(filePath)months = {r[3][:7] for r in res}  # 推导式写法print('数据日期:' + ','.join(months))else:print(_help)returnprogramName = sys.argv[0]if len(sys.argv) > 1:command = sys.argv[1]# print('command =%s'%command)if command == 'info':do_info()
else:print('命令使用方法:')print("\tpython %s COMMAND [PARAMS] " % programName)print("\tpython %s info FILEPATH [YYYY-MM] " % programName)

注意,出现报错

FileNotFoundError: [Errno 2] No such file or directory: 'data/2020-06.txt'解决方法:
自己在项目中新建个文件夹 data。

python start3.py info e:\6.xls 2020-06

start4.py

# 工作情况分析
import sys
import xlrd
import re
import datetime# 命令行编程
# 标准库 sys# 1 构建程序的框架 增加一个info指令
# 2 给info指令增加第一个参数的实现, filepath输出数据包含的月份信息
# 3 给info指令增加第二个参数        month 是一个yyyy-mm格式的字符串表示年和月 输出每个人工作统计结果
# 4 完善加班时间统计的方法
# 5 增加对假期特殊的处理__以下是对数据获取和加工的功能的代码___def __loadWorkList(filePath):wb =xlrd.open_workbook(filename=filePath)sheet =wb.sheet_by_index(0)res=[]for i in range(sheet.nrows)[2:-1]:# print(sheet.row_values(i))res.append(sheet.row_values(i))return resdef loadHoliday():res =[]with open('data/holiday.txt','r') as hf :  # 读取出来for line in hf.readlines():_holiday =line.split('|')[0]_week = line.split('|')[1]_type = line.split('|')[2].strip()  # 去掉回车符号#周一到周五,并且是休息日if (0<int(_week)<6 and _type.lower() =="h") or \((int(_week)==0 or int(_week)==6) and _type.lower())=='w': # 周六 周日 工作日res.append(_holiday)return resdef calworktimes(date,begin,end):"""通过日期、签到、签退时间,计算当天的加班的分钟"""# 我们要知道这个日期是工作日还是休息日week =int(datetime.datetime.strptime(date,'%Y-%m-%d').strftime('%w'))minute =0holidays =loadHoliday()# 周一到周五 非休息日   和   周六周日 的工作日if (0< week <6 and date not in holidays) or ((week==0 or week==6) and date in holidays):  # 不在假期的列表里        满足这些条件的,就是  工作日if re.match(r'^\d{2}:\d{2}:\d{2}$',end):b_time =datetime.datetime.strptime('17:30:00','%H:%M:%S')e_time =datetime.datetime.strptime(end,'%H:%M:%S')if e_time>b_time:minute =(e_time-b_time).seconds //60minute = minute if minute > 60 else 0  # 三元表达式   只有加班时间大于60分钟才算加班,否则时长就是0else:if re.match(r'^\d{2}:\d{2}:\d{2}$',begin) and re.match(r'^\d{2}:\d{2}:\d{2}$', end):b_time = datetime.datetime.strptime(begin, '%H:%M:%S')e_time = datetime.datetime.strptime(end, '%H:%M:%S')if e_time>b_time:minute =(e_time-b_time).seconds //60minute = minute if minute <480 else 480  # 非工作日,做多加班480分钟return minute# calworktimes('2020-07-31',None,None)
# sys.exit(0)def creatPersonData(filePath,month):res = __loadWorkList(filePath)res =[line for line in res if line[3][:7] ==month]# print(res)username=Noneuser ={}userDataList=[]for r in res:  # 遍历所有记录if username ==r[0]:  # 还是这个人# 累计当前人的数据if r[8] =='正常' and r[9] =='正常':user ['zc'] =user ['zc']+1else:user['qt'] = user['qt']+1user ['addwork'] =user ['addwork'] +calworktimes(r[3],r[4],r[5])else:   # 换人了if username:   # 不是第一行的情况,才保存userDataList.append(user)  # 保存上一个人的数据# 初始化个人数据user ={'name':r[0],'zc':0,'qt':0,'addwork':0}username =r[0]with open('data/'+month+'.txt','w') as df:for u in userDataList:linestr ='{}|{}|{}|{}'.format(u['name'],u['zc'],u['qt'],u['addwork'])df.write(linestr+'\n')def do_info():"""info指令"""_help ='指令格式: python %s info FILEPATH [YYYY-MM]' %programNameif len(sys.argv) >2:filePath = sys.argv[2]if len(sys.argv)>3:month =sys.argv[3]# 统计每个人的工作数据if not re.match(r'^\d{4}-\d{2}$',month):   # 检查月份的格式print(_help)returnelse:creatPersonData(filePath,month)else:res =__loadWorkList(filePath)months= {r[3][:7] for r in res}  # 推导式写法print('数据日期:'+','.join(months))else:print(_help)returndef do_addholiday():   # 增加节假日_help ='正确的指令格式: python %s addholiday YYYY-MM-DD TYPE(w:上班 h:休息)'%programNameif len(sys.argv) >3:_holiday =sys.argv[2]  #下划线开头,明确表示这个是局部变量_type =sys.argv[3]if not re.match(r'^\d{4}-\d{2}-\d{2}$',_holiday):  # 检查月份的格式   如果不是我们希望的日期参数格式print(_help)returnif _type.lower() !='w' and _type.lower() !='h':  # 让type不区分大小写print(_help)returnelse:print(_help)return# 将新增的日期放置文件的末尾  希望有个文件来存储我们节假日的信息holiday_file ='data/holiday.txt'with open(holiday_file,'a+') as hf :  # 往文件的末尾去添加hf.write('{}|{}|{}\n'.format(_holiday,datetime.datetime.strptime(_holiday,'%Y-%m-%d').strftime('%w'),_type)) # 往文件的最后一行追加  并且增加每行数据时添加换行符print('增加新的假日:{}{}'.format(_holiday,_type))def do_listholiday():with open('data/holiday.txt','r') as hf:   # 只读的方式打开文件for line in hf.readlines():print('日期:{} 星期 {}{}'.format(line.split('|')[0],line.split('|')[1],'工作日' if line.split('|')[2].strip()=='w' else "休息日")) # 根据w或者其他的字符,写文字  工作日  or   休息日programName=sys.argv[0]if len(sys.argv) > 1:command =sys.argv[1]# print('command =%s'%command)if command=='info':do_info()elif command=='addholiday':do_addholiday()elif command == 'listholiday':do_listholiday()
else:print('命令使用方法:')print("\tpython %s COMMAND [PARAMS] " % programName)print("\tpython %s info FILEPATH [YYYY-MM] " % programName)print("\tpython %s addholiday YYYY-MM-DD TYPE(w:上班 h:休息)] " % programName)print("\tpython %s listholiday " % programName)

- END -

本文为原创文章

❤:在这里跟我一起学习技术、职场、人生、原理、健身、摄影、生活等知识吧!

❤: 欢迎点个关注一起学习,进步充实人生。

Python 命令行编程相关推荐

  1. python 基础命令-Python 命令行(CLI)基础库

    在 CLI 下写 UI 应用 前阵子看了一下自己去年写的 Python-视频转字符动画,感觉好糗..所以几乎把整篇文章重写了一遍.并使用 curses 库实现字符动画的播放. 但是感觉,curses ...

  2. 仅需5道题轻松掌握Python命令行相关标准库 | Python技能树征题

    仅需5道题轻松掌握Python命令行相关标准库 | Python技能树征题 0. 前言 1. 第 1 题:命令行日志记录 2. 第 2 题:将日志存储在磁盘上 3. 第 3 题:命令行参数解析 4. ...

  3. Python命令行小游戏—贪吃蛇

    Python命令行小游戏-贪吃蛇 前言 一.贪吃蛇游戏初始界面及地图 1.游戏初始界面 2.游戏地图 二.命令符的设置.输出刷新和按键检测 1.库支持 2.c语言代码 3.Python代码(变量初始化 ...

  4. Python命令行可视化库

    我们通常都是在自己的电脑上跑程序,直接是可以可视化相应的结果.如果是在服务器上的话,使用终端,是不太方便查看结果.本文介绍4个可以在命令行中使用的Python库,分别是 Bashplotlib tqd ...

  5. python命令行参数解析OptionParser类用法实例

    python命令行参数解析OptionParser类用法实例 本文实例讲述了python命令行参数解析OptionParser类的用法,分享给大家供大家参考. 具体代码如下:     from opt ...

  6. 退出python命令行-退出python命令

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. 在linux环境下退出python命令模式原创 2016年11月03日 ...

  7. python命令行大全-用什么库写 Python 命令行程序(示例代码详解)

    一.前言 在近半年的 Python 命令行旅程中,我们依次学习了 argparse . docopt . click 和 fire 库的特点和用法,逐步了解到 Python 命令行库的设计哲学与演变. ...

  8. 自己写的python软件可以在哪发布-如何发布一个Python命令行工具

    本文简介 上次写的一个终端里面斗鱼TV弹幕Python版本和Ruby版本,并且发布到PIP和RubyGems上面.在发布PIP包的时候,居然Google不到一篇可以非常好的讲解这个流程的文章.于是整理 ...

  9. Python命令行解析:sys.argv[]函数的简介、案例应用之详细攻略

    Python命令行解析:sys.argv[]函数的简介.案例应用之详细攻略 目录 sys.argv[]函数的简介 sys.argv[]函数的案例应用 1.基础测试 2.进阶用法 3.sys.argv[ ...

最新文章

  1. c语言计算器实训任务案例,C/C++经典实例之模拟计算器示例代码
  2. -gMIS持续优化更新, +InSiteSearch站内搜索
  3. 今天 CSDN 编辑器的一个惊人的变化
  4. linux shell 下载并执行
  5. 软件实施或技术支持技能必备提炼
  6. SQL -- 数据字典生成工具
  7. Hanlp之理解用户自定义词典(java版本)
  8. 1万并发服务器配置_小程序后端服务器搭建:云服务器配置(1)
  9. Simulink之功率场效应晶体管(P-MOSFET)
  10. Anomaly Detection异常检测基础
  11. 1206. 设计跳表
  12. Windows 2003域更名工具(Domain Rename Tool)
  13. AspNetPager分页控件样式
  14. linux以二进制查看文件内容,Linux下二进制文件的查看和编辑
  15. SpringCloud微服务实战—翟永超 读书笔记
  16. linux超市参数,TI AM5708开发板产品参数介绍
  17. 色彩模型(HSB,RGB,CMYK,YIQ,YUV)
  18. linux关闭云锁服务器,安全软件之linux系统下云锁简单的安装方法
  19. spark学习小象学院陈超
  20. Windows挂载Linux网络共享文件夹

热门文章

  1. 虚拟内存太低怎么办?
  2. 网规:第4章 网络安全-4.8企业网络安全隔离
  3. 2022年武汉东湖新技术开发区知识产权专项资助补贴38项
  4. 不用修改注册表和组策略也能在 Win11 报名教师资格证
  5. 利用WPF建立自己的3d gis软件(非axhost方式)(二)基础状态切换
  6. mysql第二天无法连接_MySQL第二天早上第一次连接超时报错,解决方法com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:...
  7. 单片机 c语言 数字 0 9,单片机点阵式LED显示技术数字“0-9”
  8. 学习Python,怎能不懂点PEP呢? 1
  9. 字节、字、bit、byte到底咋回事
  10. 仿QQ对话列表滑动删除与置顶的原理及实现