python 常用知识点介绍2

1. serial库

安装:pip3 install pyserial

import time
import serial,threading

class SerialLogger:
    def __init__(self, port, baudrate=115200, serialLog = ''):
        self.port = port
        self.serial = serial.Serial(port=self.port, baudrate=baudrate, timeout=0.1) # 连接串口,注意当前连接的串口不能被欺压程序占用
        self.logfile = serialLog

    def serial_write(self,cmd):
        # command必须是byte类型的
        cmd = cmd + '\n'
        cmd=cmd.encode(encoding='gbk')
        self.serial.write(cmd)
        res=self.serial.readall().decode('gbk')
        print(res)

    def logToFile(self):
        # 做串口log记录
        if self.logfile == '':
            self.logfile = '%s@%s.log'%(time.strftime('%Y%m%d_%H%M%S',time.localtime(time.time())), self.port)
        print('Create Log File "%s"' %self.logfile)
        while True:
            with open(self.logfile,'a+') as logfile:
                line = self.serial.readline()
                line = line.decode('gbk')
                if line and line != '\r\n' and line != '\r':
                    if line[0] == '\r':
                        line = line[1:]
                    if line[-2:] == '\r\n':
                        line = line[:-2] + '\n'
                    if line[-1] != '\n' and line[-1] != '\r':
                        line = line + '\n'
                    line = time.strftime('[%Y.%m.%d %H:%M:%S]', time.localtime(time.time())) + line
                    logfile.writelines(line) # 接收的是str类型,以\n或者\r为换行标志,写入文件


if __name__ == '__main__':
    s = SerialLogger('com10')
    s.serial_write('bootinfo')

2. python3中 str和bytes类型的相互转换

    s1='你好'
    print(type(s1)) # 

    # str --->bytes 通过encode()或者bytes()函数来进行
    s2=s1.encode(encoding='gbk')
    print(s2) #输出 b'\xc4\xe3\xba\xc3'
    s3=bytes(s1,encoding='utf-8')
    print(s3) # 输出 b'\xe4\xbd\xa0\xe5\xa5\xbd'


    # bytes--->str  通过decode()或者str()函数来进行
    print(str(s2,encoding='gbk'))   # 输出 你好
    print(s3.decode(encoding='utf-8')) # 输出 你好

3, python 操作mysql数据库

import pymysql
#打开数据库连接
conn = pymysql.connect(host='127.0.0.1', user ="root", passwd ="root", db ="test")
cursor=conn.cursor()
cursor.execute("select * from wifi where include='yes'") # 执行mysql
res=cursor.fetchone() # 读取一行,返回的数据是元组


while res:
    print(res)
    res = cursor.fetchone()

4,json和字典区别

  • python中没有json这种数据类型
  • 在python,json中被识别为str类型,字典是dict类型
  • json的格式和dict有点相似,都是通过键值对的方式构成的,但是也有不同的地方:
  •     json的key只能是字符串,python的dict的key必须是不可变类型(str,数字,元组)
  •     json的字符串强制双引号,dict字符串可以单引号、双引号。

json和dict之间可以转换:

json.dumps()  可以将字典转化为json格式

json.loads() 可以将json转化为字典格式

import json

dict1={'A':-1,'B':8,'c':4}
str1='{"ee":1,"rr":2}'

# d1=json.dumps(dict1)  # 将字典转化为json格式
# print type(d1)  # 输出str
# print d1     # 输出{"A": -1, "c": 4, "B": 8}

d2=json.loads(str1)
print type(d2) # 输出
print d2   # 输出{u'ee': 1, u'rr': 2}

5,通过python脚本执行cmd命令的方法

可以通过subprocess或者os模块中的方法来实现

subprocess的目的就是启动一个新的进程并且与之通信,可以用来来替代os.system, os.popen命令。

subprocess模块常用的函数如下:

1, subprocess.call()

# 执行命令,并且返回状态码,多个参数用列表进行传输,retcode = call(["ls", "-l"])

也可以用字符串作为参数运行命令(通过设置参数shell=True)

a=subprocess.call(['ping','qq.com'])
print(a)  # 输出0
print(type(a)) # int

2,subprocess.popen(args,shell=False,stdout=None)

args: 表示要执行的命令,可以是str类型,也可以是数组类型
shell=True ,表示在系统默认的shell环境中执行新的进程,此shell在windows表示为cmd.exe,在linux为/bin/sh,args是字符串类型的时候,shell需要为True
stdin, stdout and stderr: 用来指定标准输入、标准输出和错误输出 常用值 subprocess.PIPE,结合stdout.readline()可以得到输出结果

a=subprocess.Popen(args='ping qq.com',shell=True,stdout=subprocess.PIPE)
while a.poll() is None:  # poll()方法用来检查进程是否还在之执行中,None表示正在执行中
    line = a.stdout.readline().decode('gbk')
    if line!='':
        print(line)
print(a.poll()) # 输出0

3,subprocess.check_output(**kwargs)

执行命令并且将输出结果返回,如果命令执行出错,将会抛出一个CalledProcessError异常

a=subprocess.check_output('ipconfig')
print(a.decode('gbk')) #输出执行结果

4, communicate()方法

communicate()方法可以和子进程进行交互,发送数据到stdin,从stdout和stderr读取数据

subp = subprocess.Popen('ping qq.com',shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
print(subp.communicate('-n 2'))  # 输出执行结果

注意:communicate 其实是循环读取管道中的数据(每次 32768 字节)并将其存在一个 list 里面,到最后将 list 中的所有数据连接起来(b''.join(list)) 返回给用户。

于是就出现了一个坑:如果子进程输出内容非常多甚至无限输出,则机器内存会被撑爆

解决办法:

将stdout重定向到文件中

f=open('aa.txt','a+',encoding='gbk')
subp = subprocess.Popen('ping qq.com -n 2',shell=True,stdout=f)
f.close()

6,通过python对比文件的异同

(1)通过文件的md5值来比较文件的不同

利用hashlib模块的md5方法,生成固定为16字节长度的字符串(用32位的16进制字符串来表示),通过对比两个文件的MD5值,来比较文件是否发生变化
import hashlib
def get_content_mtd(self,file_name):
        md5 = hashlib.md5(open(file_name,'rb').read()).hexdigest()
        return md5

(2)比较两个文件最后被修改的时间戳

os.stat() 方法用于在给定的路径上执行一个系统 stat 的调用,st_mtime返回最后一次修改的时间

    def get_modify_time(self,file_name):
        mtime= os.stat(file_name).st_mtime
        print(mtime)
        return mtime

7,利用python识别简单的验证码

环境搭建:

(1)安装tesseract-OCR,下载地址:Index of /tesseract

(2)安装完成后,需要配置环境变量,在path中添加tesseract的安装目录:E:\softinstall\Tesseract-OCR;在系统变量中添加TESSDATA_PREFIX;

python 常用知识点介绍2_第1张图片

(3)pip3 install pytesseract

from PIL import Image
import pytesseract

image = Image.open('aa.png')
text = pytesseract.image_to_string(image)
print(text)

注:这种方法只能是被简单,清晰地验证码;对于模糊的验证码,需要更复杂的处理(降噪、切割等)。

8, python时间戳相减

# ---------------- 两个时间戳相减 ---------------------

t1 = '2022-09-30 10:31:06'
print('t1 ', t1)
t_now = time.strftime('%Y-%m-%d %H:%M:%S')  # str
print('time now ', t_now)
# 两个时间字符串相减
td = datetime.datetime.strptime(t_now, '%Y-%m-%d %H:%M:%S') - datetime.datetime.strptime(t1, '%Y-%m-%d %H:%M:%S')
print('时间相减得到的时间差 ',td)  # datetime.timedelta
print('时间差中的天数 ', td.days) # int
print('时间差中的秒数', td.seconds) # int

输出:

t1  2022-09-30 10:31:06
time now  2022-09-30 15:34:19
时间相减得到的时间差  5:03:13
时间差中的天数  0
时间差中的秒数 18193

# ----------------------- 时间移动 -----------------

t1 = '2022-09-30 10:31:06'
print('t1: ', t1)
t_now = datetime.datetime.strptime(t1 ,'%Y-%m-%d %H:%M:%S') # 
print('当前时间:', t_now)
t2 = t_now + datetime.timedelta(days=-1, hours=1, seconds=1, minutes=2) # 
print('移动后的时间:', t2)

输出:

t1:  2022-09-30 10:31:06
当前时间: 2022-09-30 10:31:06
移动后的时间: 2022-09-29 11:33:07

你可能感兴趣的:(python,python)