Package: lightUtils
lightUtils本项目仅为自己的Python常用工具类。其中有些是自己写的，有的则是网上找的，由于有些还需要copy代码到相应需求处才能使用，比如说放在gist或其他代码片段保存工具并不太方便，所以这里也构建一个库，用的时候先install然后直接import就好了。功能彩色日志获取系统可用tcp端口从文件中逐行获取json对象发送邮件将时间间隔（s为单位）转换为日时分秒表示将迭代器转化为批量数据返回形式执行系统命令并获取执行结果检查文件是否存在以及是否对应相应拓展名获取文件名，不含拓展名将迭代器截断，只返回前面部分获取变量名获取变量类型和属性信息将可序列化对象以json格式写入文件中比较两个字符串差异，高亮差异部分根据项目名和当前脚本路径检测项目路径并添加至系统路径读取yaml文件终端彩色输出使用1.彩色日志示例fromlightutilsimportloggerlogger.info("info")logger.warning('warning')logger.debug('debug')logger.error('error')效果如图：2.获取系统可用tcp端口示例fromlightutilsimportget_free_tcp_portport=get_free_tcp_port()print(port)执行结果为：49783<class'int'>3.从文件中逐行获取json对象从文件中逐行获取json对象，示例fromlightutilsimportread_json_lineforobjinread_json_line('test.json'):print(obj)执行结果为：{'info':{'word':'丘为','means':[['寻西山隐者不遇','寻西山隐者不遇'],['左掖梨花','左掖梨花']]},'type':'ambiguous'}{'info':{'word':'丘为','means':[['寻西山隐者不遇','寻西山隐者不遇'],['左掖梨花','左掖梨花']]},'type':'ambiguous'}原文件内容为：{"info":{"word":"丘为","means":[["寻西山隐者不遇","寻西山隐者不遇"],["左掖梨花","左掖梨花"]]},"type":"ambiguous"}{asdf}{"info":{"word":"丘为","means":[["寻西山隐者不遇","寻西山隐者不遇"],["左掖梨花","左掖梨花"]]},"type":"ambiguous"}错误输出日志error.log内容如下：line2: {asdf}4.发送邮件使用Python发送一封邮件示例fromlightutilsimportsend_email_notificationto="iamlightsmile@qq.com"subject="just a test"contents=["the test of lightUtils's send_email_notification function"]result=send_email_notification(to,subject,contents)ifresult:print("发送成功！")else:print("发送失败！")运行结果：发送成功！效果截图：5.将时间间隔（s为单位）转换为日时分秒表示使用示例fromlightutilsimporttime_convertprint(time_convert(10000000.234))print(time_convert(1000000.0))print(time_convert(100000.0))print(time_convert(10000.0))print(time_convert(1000.0))print(time_convert(100.0))print(time_convert(10.0))print(time_convert(1.0))print(time_convert(0.0))运行结果：115天17小时46分钟40.23秒
11天13小时46分钟40.0秒
1天3小时46分钟40.0秒
2小时46分钟40.0秒
16分钟40.0秒
1分钟40.0秒
10.0秒
1.0秒
0.0秒6.将迭代器转化为批量数据返回形式使用示例fromlightutilsimportbatchif__name__=='__main__':foriteminbatch(range(100)):print(item)运行结果：[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
[20, 21, 22, 23, 24, 25, 26, 27, 28, 29]
[30, 31, 32, 33, 34, 35, 36, 37, 38, 39]
[40, 41, 42, 43, 44, 45, 46, 47, 48, 49]
[50, 51, 52, 53, 54, 55, 56, 57, 58, 59]
[60, 61, 62, 63, 64, 65, 66, 67, 68, 69]
[70, 71, 72, 73, 74, 75, 76, 77, 78, 79]
[80, 81, 82, 83, 84, 85, 86, 87, 88, 89]
[90, 91, 92, 93, 94, 95, 96, 97, 98, 99]7.执行系统命令并获取执行结果使用示例fromlightutilsimportexecute_cmdif__name__=='__main__':state,info=execute_cmd('ls')ifstate:print(info)运行结果：chunk_demo.py
cmd_demo.py
error.log
json_file_demo.py
log_demo.py
port_demo.py
send_email_demo.py
test.json
time_convert_demo.py8.检查文件是否存在以及是否对应相应拓展名使用示例from lightutils import check_file

if __name__ == '__main__':
    # check_file('fuck.txt', 'txt')
    check_file('file_demo.py', 'txt')
    # check_file('file_demo.py', 'py')运行效果Traceback (most recent call last):
  File "E:/Projects/myProjects/lightUtils/examples/file_demo.py", line 10, in <module>
    check_file('file_demo.py', 'txt')
  File "E:\Projects\myProjects\lightUtils\lightutils\common\file.py", line 25, in check_file
    raise NotSpecifiedFileException('xx.' + ext)
lightutils.common.file.NotSpecifiedFileException: 并非指定的文件错误，应该是形如：xx.txt9.获取文件名，不含拓展名使用示例fromlightutilsimportget_file_nameif__name__=='__main__':print(get_file_name("hello_world.py"))运行效果hello_world10.将迭代器截断，只返回前面部分使用示例fromlightutilsimportcutoff_iterif__name__=='__main__':foritemincutoff_iter(range(20)):print(item)运行效果0
1
2
3
4
5
6
7
8
911. 获取变量名使用示例fromlightutilsimportretrieve_nameif__name__=='__main__':a=3print(retrieve_name(a))a运行效果12. 获取变量类型和属性信息使用示例fromlightutilsimportinspect_variableif__name__=='__main__':a=3print(inspect_variable(a))运行效果{'name': 'a', 'type': "<class 'int'>", 'attrs': "['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']"}13. 将可序列化对象以json格式写入文件中使用示例fromlightutilsimportwrite_json_lineif__name__=='__main__':withopen('./write_json.json','w',encoding='utf-8')asfile:write_json_line(file,{'a':3})运行效果write_json.json文件内容：{"a": 3}14. 比较两个字符串差异，高亮差异部分代码主要是copy自苏神的bojone/text_compare: 用python比较两个字符串差异，高亮差异部分使用示例fromlightutilsimportstring_compareif__name__=='__main__':a="上周去钓鱼"b="上周去爬山"string_compare(a,b)运行效果15. 根据项目名和当前脚本路径检测项目路径并添加至系统路径主要应用场景是在一个项目中需要根据路径去添加和使用包，这里提供程序自动检测的功能，以使得不必操心具体相对路径位置，只要提供程序包名即可。使用示例fromlightutilsimportadd_sys_pathproject_path='lightutils'if__name__=='__main__':add_sys_path(__file__,project_path)运行结果D:\Software\Anaconda3\envs\spider\python.exeE:/Projects/myProjects/lightUtils/examples/add_path_demo.py[2020-09-1110:24:47][INFO][MainThread][path.py:27]已成功将E:/Projects/myProjects/lightUtils添加至系统路径16.读取yaml文件# -*- coding: utf-8 -*-fromlightutilsimportload_yamlyaml_path='test.yml'if__name__=='__main__':print(load_yaml(yaml_path))test.yml文件内容：test:3程序运行结果：{'test':3}17.终端彩色输出fromlightutilsimportcolorprint(color.green("green"))参考lightless233/colorlog: Python彩色log模块封装Getting a random free tcp port in python using socketskootenpv/yagmail: Send email in Python conveniently for gmail using yagmailPython最良心的邮件发送库--yagmail_Detector_的博客-CSDN博客Python用QQ邮箱发送邮件时授权码问题_wateryouyo的博客-CSDN博客python - how to split an iterable in constant-size chunks - Stack Overflowpython获取系统信息模块详解 - 编程语言 - 亿速云Python中调用命令行的几种方法 - 简书python如何将变量名转化为同名字符串？ - 知乎bert4keras/snippets.py at master · bojone/bert4kerasbojone/text_compare: 用python比较两个字符串差异，高亮差异部分reorx/python-terminal-color: Drop-in single file library for printing color in terminal打赏如果该项目对您有所帮助，欢迎打赏~