Python 小巧精致,拿来做些小工具是十分可爱的。
这个post主要是来记下一些小技巧,希望自己在再次遇到的时候可以很快的想起来。Kata
使用PyIntsaller对程序进行打包
由于不一定是在本机运行,对于部分的电脑没有python环境,所以这里就对本地的脚本进行打包,成一个整体的exe文件。
python 同时遍历list索引和值
这里使用built-in
方法,enumerate,来解决这个问题,正如其名,是枚举列表中的所有元素和其序列。如下:
>>> list(enumerate([1,2,3,4,5,6]))
[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]
所以使用这种特性,可以来遍历索引同时遍历值。像是这样:
my_list = ['a', 'b', 'c']
for idx, val in enumerate(my_list):
print(idx, val)
而且,还解决了一个痛点,在遍历列表的时候,想定位这个元素,苦于拿不到索引只能用indexof
,很不优雅的解决问题。
字符串中提取所有的数字
这个需求比较常遇到,在这个proj里面主要是对文章的ID,很难进行分配,之前是使用csv文件的列加上偏移,来实现文章的ID 的,后面发现ID这样依赖这种不稳定的方式生成,后出现ID重复文件覆盖的情况。所以后面就想到了HASH。这里便是从HASH里面提取所有的数字。
核心功能,使用一行正则就可以实现。
print(re.findall(r"\d+\.?\d*",string))
从代码上理解,findall 提提供所有匹配字串。这里看出,匹配\d+
和 \.?\d*
也就是匹配任意个数字,加上点和任意单字符和任意数字。
代码说话:
>>> md5.update('123'.encode())
>>> md5.hexdigest()
'4297f44b13955235245b2497399d7a93'
>>> re.findall(r'\d+', md5.hexdigest())
['4297', '44', '13955235245', '2497399', '7', '93']
>>> functools.reduce(lambda x,y: x+y, re.findall(r'\d+', md5.hexdigest()))[:10]
'4297441395'
这样比较优雅的解决了ID的问题。
使用filter来优雅的匹配后缀
用来过滤后缀匹配的文件,
ext_list = [".rar",'.pdf',".zip",".doc",".docx"]
file_list = os.listdir()
up_files = list(filter(lambda x: os.path.splitext(x)[-1] in ext_list ,file_list))
写文件中文乱码
在最后写入文件的时候,中文会乱码(GB编码),所以在最后统一使用utf-8的编码,代码如下
with open('./xmls/import-'+time_str+'.xml', 'wb+') as f:
f.write(xml_total.format(final_xml).encode("utf-8"))
使用二进制写入,在最后对内容进行utf8编码。
对CSV文件的解析
def parse_csv(file_path):
import csv
info_list = list()
with open(file_path,'r') as myFile:
lines=csv.reader(myFile, delimiter=",")
for id,line in enumerate(lines):
info_list.append(line)
# 这里跳过表头
return info_list[1:]
使用datetime来方便的计算时间差
由于需要记录GMT时间,所以需要对当前时间减去8,操作如下:
datetime.datetime.now()-datetime.timedelta(hours=8, minutes=-2)).strftime("%Y-%m-%d %H:%M:%S")
函数定时执行
这里算是一个小的tricks,使用线程和定时器来实现的一个函数被定时执行的功能。具体的代码如下:
def fun_timer():
print('Hello Timer!')
global timer
timer = threading.Timer(5.5, fun_timer)
timer.start()
timer = threading.Timer(5.5, fun_timer)
timer.start()