WP批量导入的Py工具实现

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()

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注