Python基础知识

本篇只记录最基础的Python知识,不记录模块和具体程序,不涉及第三方库

安装

  1. 软件安装:https://blog.csdn.net/Ailsa2019/article/details/105252766
    位置可自定义, 一定要新建文件夹保存以保持整洁、避免误删

  2. 安装第三方库:CMD下输入【pip install xxx】
    安装cryptography需指定版本号及更多参数,实测可用

pip install cryptography==2.4.2 --only-binary=:all:

Python基础知识_第1张图片

  1. 查看已安装的所有库:CMD下输入【pip freeze】
    常用的第三方库:pyinstaller, requests, lxml, selenium, pymysql, cryptography

  2. 手动下载(资源在墙外时可能要用到)
    下载文件到【python>lib>site-packages】文件夹,然后CMD下输入【pip install 库名】

查看帮助文档

help() - 详细介绍,dir() - 功能列表,type() 类型——获取搜索关键词

语法

continue:跳过该次循环,break:退出循环,return:结束整个方法,包括循环

lambda 表达式(单行匿名函数)

lambda x,y:x+y

循环下调用循环因子的函数

  1. 要用lambda语句,且循环因子参数要写成变量的形式【k=key】,表示执行时才调用
  2. 如果按钮是用bind绑定命令的,第一个参数是self,指代按钮本身
  • 若不满足上述条件,程序会代入每个循环因子自动运行一遍,且后续点击按钮时不再运行
for key in L: Button(wi, command = lambda k=key:function(k))
for key in L: b.bind("", command = lambda self, k=key:function(k)) 

字符串

参数化 - 参数在后

a = "1{}3"
a.format(2)
>>> '123'

参数化 - 参数在前

x = 2
f"1{x}3" 
>>> '123'

文件字符化

file.read()
open("test.txt").read().split("\n")[:-1]  #比readline实用

A-Z

L = [chr(i) for i in range(ord('a'),ord('z')+1)]

解码

str有encode()函数,bytes有decode()函数

x = "x"
x.encode("gbk")
>>>b'x'

y = b"y"
y.decode()
>>>'y'

特殊字符

把特殊字符转化为普通字符。有些字符python无法print输出,也无法入sql数据表

import sys
non_bmp = dict.fromkeys(range(0x10000,sys.maxunicode + 1),0xfffd)
string = string.translate(non_bmp)

元组 字典 列表

计数

L.count(item)

列表pop

从列表末尾提取一个元素,提取后,将元素从列表中删除

L.pop(0)

快速创建列表或字典

L = [ tup[0] for tup in L ]
D = { i:0 for i in L }

元组 列表排序 简单

默认为升序,如果想要降序,设置reverse=True

L.sort(key=None, reverse=False)

元组 列表排序 按第N个元素

L = [(2, 2), (3, 4), (4, 1), (1, 3)]
L.sort(key=lambda tup:tup[1])
>>>[(4, 1), (2, 2), (1, 3), (3, 4)]

列表的展开 提取 拆分

range参数:起始位置,结束位置,步长。列表索引参数:起始位置,结束位置

L = [j for i in L for j in i]
L = [i[0] for i in L]
L = [L[i:i+step] for i in range(0, len(L), step)]

列表转字典

以第一个列表的元素为key,以第二个列表的元素为value,创建字典

dict(list(zip(L1, L2)))

两列表left join

语法【for i in A if i not in B】效率很低。因为【not in】要搜索完整个列表才能确认。此时,可以借助字典中转。

  1. 简单列表
D = { i:0 for i in L1 }                          #按大表创建字典
for i in L2: D[i] = None                         #按小表改写字典
rows = [key for key in D if D[key] is not None]  #只保留未被改写的key
  1. 大列表
D = {}
for tup in L1:  D[tup[0]] = tup                     #按大表创建值
for tup in L2:  D[tup[0]] = None                    #按小表改写值    
rows = [D[key] for key in D if D[key] is not None]  #未被改写的值 

webbrowser

用系统默认浏览器打开网页。

url格式:https://www.baidu.com/。如果只有域名,系统会调用IE浏览器打开

webbrowser.open_new_tab(url)

pathlib 路径

输入路径,获取该路径下所有文件的绝对地址,以列表形式返回

from pathlib import Path
folder = Path("C:/Users/Administrator/Desktop/Emails")
paths = list(folder.iterdir())

os 文件

获取当前目录

L = os.listdir()  #获取当前目录 

修改子文件夹里的文件名

old = []    #旧文件名列表
new = []    #新文件名列表
for root, dirs, files in os.walk("."):  #遍历父文件夹files下的子文件夹
    for file in files:                  #遍历子文件夹file下的文件
        p = old.index(file)
        o = os.path.join(root + "\\" + old[p])
        n = os.path.join(root + "\\" + new[p])
        os.rename(o, n)                 #修改文件名

提取子文件

  1. 用两个for循环,遍历(walk)总文件夹下,所有层级的文件
  2. 用os.path.join拼接路径与文件名
  3. 重命名,提取到总文件夹——为避免重名,用各级路径拼接成新的文件名
  4. 用shutil.move将重命名后的文件提取到总文件夹
  5. 提取完成后,总文件夹下的子文件夹均被清空(文件夹还在,文件没了),可以直接删除。
import os
import shutil

for root, dirs, files in os.walk('总文件夹'):
    for file in files:
        old_name = os.path.join(root, file)
        new_name = old_name.replace("\\", " ")
        os.rename(old_name, new_name)
        shutil.move(new_name, '总文件夹')

pyperclip 复制字符串

pyperclip.copy(string)

time 时间

python的datetime模块功能类似

  1. 常用时间格式:2021-07-08 16:44:38
  2. 当前时间,指定格式:16:44:38
  3. 转换时间字符串的样式
time.strftime('%Y-%m-%d %H:%M:%S')
time.strftime('%H:%M:%S',time.localtime())

time_ = time.strptime(time_, time_format)
time_ = time.strftime(new_format, time_)

datetime 日期加时间

date是在datetime模块下的子模块

import datetime
year = datetime.datetime.today() - datetime.timedelta(days=365)
year = year.strftime('%Y-%m-%d %H:%M:%S')

email

字符串/字节串转邮件格式

import email
e = email.message_from_bytes()
e = email.message_from_string()
e.get("subject")  #从邮件元素中获取内容

分离具体内容、编码方式

from email import header
header.decode_header(line) #返回一个大列表,内部元组为(content, code)

进一步提取内容

from email import utils
email = utils.parseaddr(email)[1]    #从姓名 <地址>中,提取地址(仅一组,鸡肋)
date  = utils.parsedate_to_datetime(date)  #日期转datetime格式

requests

简单爬取用request,速度较快。深度爬取、模拟人工操作用selenium。

以爬取多个网站的标题为例:request成功需要逐项满足:没超时 + code为200 + 页面转text成功 + 提取title成功。逐个if太冗杂,用try墙内外各requests三次,仍然有35%访问出错

selenium进行超时设置后,不会出现异常,爬不到标题时,browser.title为空白

超时设置:driver.set_page_load_timeout(60)

基础设置

url要带协议,可以设置cookies、是否验证安全性、限制时间。访问正常时,响应码为200

html = requests.get(url, cookies=cookies, verify=False, timeout=30)
html.text
html.status_code == 200

取消不安全(未加密)警告

from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

正则表达式

详见【疯狂Python 第10章 内置模块之正则表达式 re】
电话号码:1\d{10}\D。第一位是1 + 中间10位都是数字 +第12位不是数字

邮箱:\w+@\w+.\w+.\w+|\w+@\w+.\w+

  • 【\w】:数字/字母/下划线
  • 【+】:1~N个
  • 【|】:或
  • 优先匹配域名带两个点的邮箱,再匹配域名只有一个点的邮箱

匹配邮箱地址的正则表达式

来自https://emailregex.com/,短的都不好使

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

你可能感兴趣的:(Python实战经验,python,开发语言,后端,正则表达式)