Files
docs/开发文档/python/python教程.md
2026-01-14 11:27:47 +08:00

1489 lines
66 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 更换国内pip源[[故障解决方案大全#^508e71]]
[python安装包](https://repo.huaweicloud.com/python/)
# python高级技巧
## 字符串操作技巧
### 字符串(string)操作
```python
string.lower() #将str字符串字母改为小写
string.upper() #将str字符串字母改为大写
string.split('-') #字符串分割,分隔符为字符串内的'-',返回一个列表
string.count(sub) #统计sub字符串出现在str字符串中的次数
string.replace(old,new) #将str字符串出现的old字符串全部替换为new字符串
string.center(width,fchar) #字符串str根据width的宽度居中,fchar为填充的字符
string.strip(fchar) #去掉字符串str两侧中出现的fchar字符
string.join(iter) #在iter变量的除最后一个元素外,在每个元素后添加一个str
str(string) #函数返回一个用户易读的表达形式
repr(string) #函数产生一个解释器易读的表达形式
#字符格式类型转换
hex()#转换一个整数对象为十六进制的字符串
oct()#转换一个整数对象为八进制的字符串
bin()#转换一个整数对象为二进制字符串
chr()#转换一个[0,255]之间的整数为对应的ASCII字符
ord()#将一个ASCII字符转换为对应整数
#16进制转10进制
int('10',16)
int('0x10',16)
#8进制转10进制
int('0o10',8)
int('10',8)
#2进制转10进制
int('0b1010',2)
int('1010',2)
#字节串转整数
struct.unpack('<hh',bytes(b'\x01\x00\x00\x00'))  ==>  (1,0) #转义为short型整数
struct.unpack('<L',bytes(b'\x01\x00\x00\x00'))  ==>  (1,) #转义为long型整数
#整数转字节串
struct.pack('<HH',1,2) ==> b'\x01\x00\x02\x00' #转为两个字节
struct.pack('<LL',1,2) ==> b'\x01\x00\x00\x00\x02\x00\x00\x00' #转为四个字节
#字符串转字节串
'12abc'.encode('ascii')  ==>  b'12abc' #字符串编码为字节码
bytes([1,2,ord('1'),ord('2')])  ==>  b'\x01\x0212' #数字或字符数组
bytes().fromhex('010210')  ==>  b'\x01\x02\x10' #16进制字符串
bytes(map(ord,'\x01\x02\x31\x32'))  ==>  b'\x01\x0212' #16进制字符串
bytes([0x01,0x02,0x31,0x32])  ==>  b'\x01\x0212' #16进制数组
#字节串转字符串
bytes(b'\x31\x32\x61\x62').decode('ascii')  ==>  '12ab' #字节码解码为字符串
str(bytes(b'\x01\x0212'))[2:-1]  ==>  '\x01\x0212' #字节串转16进制表示,夹带ascii
str(binascii.b2a_hex(b'\x01\x0212'))[2:-1]  ==>  01023132 #字节串转16进制表示,固定两个字符表示
[hex(x) for x in bytes(b'\x01\x0212')]  ==>  ['0x1','0x2','0x31','0x32'] #字节串转16进制数组
```
---
### 使用f-string填充字符串
```python
str = 'world'
string = f'hello {str}!'
```
### 使用find()查找字符串的索引
```python
str = 'hello world'
print(str.find("wo")) //返回字符串起始索引
```
### path操作
```python
# url路径操作
```
## 迭代相关技巧
### 集合(set)操作
```python
#集合(set):是一个无序不重复的元素序列,可以使用{}或set()创建,创建空集合只能使用set(),{}是创建一个空字典.
set.add(x) #将元素添加到集合中;
set.update(x) #将元素添加到集合,x可以是列表,元组,字典例:set.update({1,3}),set.update([1,2]);
set.remove(x) #从集合中移除元素x,元素不存在会报错;
set.discard(x) #从集合中移除元素x,元素不存在不会报错;
set.pop() #随机删除集合中的一个元素;
len(set) #计算元素中的个数;
set.clear() #清空集合;
set.copy() #返回一个set集合的副本
set(s) #将其他类型变量转换成集合类型
s in set #判断元素s是否在集合中存在,存在返回true,不存在返回false;
s not in set #判断元素是否不在集合中,不在返回true,在返回false
#集合操作符
s|t #返回一个新集合,包含s和t中的所有元素
s-t #返回一个新集合,包含s但不在t中的元素
s&t #返回一个新集合,包含同时在s和t中的元素
s^t #返回一个新集合,包含s和t中非相同的元素
s<=t,s<t #返回true/false #判断s和t的子集关系
s>=t,s>t #返回true/false #判断s和t的包含关系
#增强集合操作符
s|=t #更新集合s,包含s和t中的所有元素
s-=t #更新集合s,包含s但不在t中的元素
s&=t #更新集合s,包含同时在s和t中的元素
s^=t #更新集合s,包含s和t中的非相同元素
```
---
### 字典(dictionary)操作
```python
#字典(dictionary):用大括号包含内容dict={'user':'admin','pwd':'123'},字典的键不能变,键值能变.一个键只能出现一次.例:dict['user']='login',输出为{'user':'login','pwd':'123'};
del ['user'] # 删除该键;
del dict # 删除字典;
dict.clear() # 清空字典;
str(dict) # 输出字典;
dict.get(key,default=None) # 返回指定键的值,如果值不在字典中返回默认值,默认为None
dict.setdefault() # 和get()类似,如果键不在字典中,将会添加键,并将值设为默认
dict.keys() # 返回一个替代器,可转换为列表
dict.values() # 返回一个替代器,可转换为列表
dict.items() # 以列表返回可遍历的元组数据
dict.copy() # 返回一个字典的浅复制
dict.update(dict2) # 将字典dict2的键值对更新到dict里
dict.pop(key) # 删除字典给出键的值,并返回,key参数必须给出,否则返回默认值
dict.popitem() # 随机返回并删除字典中的一对键值
```
---
### 元组(tuple)操作
> 元组(tuple):用小括号包含内容('ss',21),也可以不用括号,
> 元组中的元素不能修改,也不能删除,
> 只能用del tuple删除整个元组,其余与列表操作基本一样,括号由中括号改为小括号.
---
### 列表(list)操作
```python
list = [1,2,3] #创建名为list的列表,有1,2,3三个元素,
list.extend([6,7]) #extend()方法向列表末尾添加多个数据
list.insert(0,0) #insert()方法向列表插入数据,第1个参数为要插入的位置,第2个数据为插入的数据,0为第一个
list[0] #读取list列表索引值为0的数据,结果为0
del list[2] #删除list列表索引为2的元素,结果为3
del list #删除整个列表
list.append('ss') #在列表末尾添加元素
list.count('ss') #统计某个元素在列表中出现的次数
list.extend(list1) #在列表末尾追加另一个列表的多个元素
list.index('s') #在列表中找到第一个匹配项的索引位置
list.pop() #移除列表的一个元素,并返回该元素的值,默认为最后一个
list.remove('ss') #移除列表第一个匹配项的值
list.reverse() #反向排序列表
list.sort(key=None,reverse=false) #对列表进行排序,默认为从小到大
# 示例结果[1,13,2,24]
list.sort(key=lambda ele:len(ele),reverse=False) #针对数字排序.默认升序
# 示例结果[1,2,13,25]
list.sorted(data, key=lambda ele:int(ele[1]), reverse=False)
# 示例按元组下标为1的数字进行排序后的结果:[(46, '10'),(67, '102'),(45, '107')]
sorted(list) #对列表或字符串排序并返回一个新列表(不会修改原列表)
list.clear() #清空列表
list.copy() #复制列表
[1,2]+[3,4] #+代表连接符,结果为[1,2,3,4]
[hi]*2 #*代表重复,结果为['hi','hi']
3 in [1,2,3] #遍历列表3是否在列表内,结果为true,如果查找的元素没在列表,程序会报错
for x in [1,2,3]:print(x) #迭代,结果为1 2 3
#列表拼接和嵌套
a=[1,2],b=[3,4]
a+=b #把b列表链接到a列表末尾,结果为[1,2,3,4]
c=a+b #嵌套(把列表做成一个多元数组):把a和b放到c列表,结果为[[1,2],[3,4]]
ls = [c for c in string] #快速创建列表
#第一个c可以进行字符串拼接
```
---
### 将序列化数据创建一个可迭代对象
```python
list2 = ['a', 'b', 'c', 'd']
```
### 生成器表达式
```python
gen_exp=(x for x in range(10))
next(gen_exp)
```
### 生成器函数
```python
def fibonacci(num):
a, b = 0, 1
for _ in range(num):
yield a
a, b = b, a + b
# 使用for循环迭代生成器
for value in fibonacci(10):
print(value)
```
### 使用enumerate和zip处理列表和迭代对象
```python
# enumerate函数可以接受一个可迭代对象返回一个包含索引和元素的元组的可迭代对象。
l = [1,2,3]
for index,i in l:
print(index,i)
# 输出01,12,23
# zip函数可以接受多个可迭代对象返回一个包含多个元素的元组的可迭代对象。
list1 = [1, 2, 3]
list2 = ['a', 'b', 'c', 'd']
zipped = zip(list1, list2)
# 将zip对象转换为列表以便查看其内容
print(list(zipped))
# 输出: [(1, 'a'), (2, 'b'), (3, 'c')]
# 你可以看到尽管list2有四个元素但zipped只包含了三个元素
# 因为zip在list1较短的列表结束时停止了。
from itertools import zip_longest
list1 = [1, 2, 3]
list2 = ['a', 'b', 'c', 'd']
# 使用zip_longest并指定填充值为'missing'
zipped_longest = zip_longest(list1, list2, fillvalue='missing')
# 转换为列表以查看内容
print(list(zipped_longest))
# 输出: [(1, 'a'), (2, 'b'), (3, 'c'), (None, 'd')]
```
### 高效迭代对象操作
```python
`map`  `filter` 都返回迭代器而不是列表或其他类型的集合
# map函数可以接受一个函数和一个可迭代对象返回一个包含函数作用于可迭代对象的每个元素的结果的可迭代对象。
def square(x):
return x * x
numbers = [1, 2, 3, 4, 5]
squared = list(map(square, numbers))
print(squared) # 输出: [1, 4, 9, 16, 25]
# filter函数可以接受一个函数和一个可迭代对象返回一个包含函数返回真值的可迭代对象的元素的可迭代对象。
def is_even(n): return n % 2 == 0 numbers = [1, 2, 3, 4, 5, 6] filtered = list(filter(is_even, numbers)) print(filtered) # 输出: [2, 4, 6]
```
## 函数操作技巧
### 函数用法
```python
function(self,*self,**self,sf=default)`
#参数self可以是任意整数,浮点数,字符串
#参数*self是self参数的集合,传递后为元组
#参数**self是字典参数,传递时采用赋值的方式
#参数sf是可变参数,调用函数是未传递该参数的值时,使用默认值,如果传递了参数,则使用传递的参数
lambda #函数用法
var = lambda #参数:表达式
#定义函数lambda,参数外不用加括号,多参数时,用逗号分隔,冒号后跟表达式,将函数绑定给变量var
#函数变量作用域
local #定义局部变量
enclosing #定义闭包函数外的函数中
global #定义全局变量
built-in #定义内置变量
```
---
### 4.函数参数化和解构
```python
def my_func(*args, **kwargs):
for arg in args:
print(arg)
for key, value in kwargs.items():
print(f"{key}: {value}")
my_func(1, 2, 3, name='Alice', age=30)
```
### 7.使用装饰器
```python
# 装饰器是一种高阶函数,它可以接受一个函数作为参数,并返回一个修改后的函数。装饰器可以在不改变原函数的定义和调用方式的情况下,增加一些额外的功能。例如,给函数添加计时功能:
import time
def timer(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
print(f"{func.__name__} took {time.time() - start} seconds to run.")
return result
return wrapper
@timer
def add(x, y):
return x + y
print(add(10, 20)) # 输出时间信息和结果
```
### 8.使用lru_cach装饰器缓存数据
```python
import functools
import time
# 最多缓存128个不同的结果
@functools.lru_cache(maxsize=2)
def my_func(x):
time.sleep(2) # 模拟程序执行时间
return x
print(my_func(1))
print("=========")
print(my_func(1)) # 结果已被缓存,无需等待立即返回
```
## 循环及条件控制
### 循环控制
```python
#break终止循环,跳出循环体;continue终止本次循环,重新开始循环
#python没有switch-case语句
#for循环为遍历或计数
array = (1,2,3)
for i in array:
print(i,end=',') #遍历数组,结果为1,2,3
#for循环内建函数range(start,stop,step)
#当range只有1个参数时,生成一个从0开始到当前参数结束不包含当前参数的一组数据;
for i in range(5): #生成(0-4的数字)
print(i,end=',') #结果为0,1,2,3,4
print('\n')
#有2个参数时,生成一个从第1个参数到第2参数不包含第2个参数的一组数据
for i in range(0,5): #生成(0-4的数字)
print(i,end=',') #结果为0,1,2,3,4
print('\n')
#有3个参数时,生成一个从第1个参数到第2参数不包含第2个参数的第3个参数倍数的一组数据
for i in range(0,10,2): #生成(0-9之间2的倍数的数字)
print(i,end=',') #结果为0,2,4,6,8
print('\n')
#自动计数器
for index,i in enumerate(string)
enumerate() #函数会返回两个值,一个下标值,和对应的元素
#while循环条件为真就执行循环
while True: #无限循环
pass
```
---
### 三元表达式
```python
# 如果x大于y成立,返回x的值,否则返回y的值
result = x if x>y else y
```
---
### 条件控制
```python
#通过缩进来控制语句或函数的开始与结束,使用Tab键或空格缩进
if expression:
pass
elif expression:
pass
else:
pass
```
## 输入输出
### json数据格式化输出
```python
import json
jsondata={ "code": "0", "data": { "currentPage": 1, "pageData":2}}
print(json.dumps(jsondata,indent=4,ensure_ascii=False)) #indent使用4个空格,ensure_ascii=False不对非ascii字符进行转义
```
### 标准输出重定向
```python
import sys
f = open('log.txt','w')
sys.stdout = f
f.close()
sys.stdout = sys.__stdout__
```
---
### input输入
```python
input("提示语")
```
### print输出
```python
#输出字符串拼接
print("str1" + "str2") #结果为str1与str2合并
#重复输出字符串
print("str" * 2) #结果strstr
#加引号代表字符串,不加引号代表数字或变量,引号使用要成对
print(5 + 8) #代表是数学运算,结果为13
print('5' + '8') #代表字符串拼接,结果为58
print('Let\'s,go!') #在字符前加\代表转义,结果为Let's,go!
print(r'c:\www') #在字符串前加r代表输出原始字符串,结果为c:\www
print("""
hello,world!
hao are you!
""") #三重引号会按照写入格式输出内容,结果为
print('内容',end='') #加end代表在输出完内容后添加的符号,如换行\n,默认为空格.不加end输出完默认为换行
#输出美化
import pprint
pprint.pprint('str')
```
### format格式化用法
> {<参数序号>:<格式控制标记>}
> <:> #用于引导
> <填充> #需要填充的字符或内容
> <对齐> #<左对齐;>右对齐;^居中对齐
> <宽度> #字符串所占宽度
> <,> #千位分隔符
> <.精度> #输出浮点数的精度,或字符串最大长度
> <类型> #整数类型b,c,d,o,x,X;浮点类型e,E,f,%
---
### 文件读写
```python
file.close()#关闭文件
f.read(size)#读取一定数目的数据,作为字符串或字节对象返回
f.readline()#从文件中读取单独的一行,返回为空则读到最后一行
f.readlines()#返回该文件中包含的所有行.
f.write(str)#将str写入文件中,返回写入的字符数,写入的不是字符串需要先进行转换,例:str(string),f.write(str).
f.tell()#返回文件对象当前所处的位置
f.seek(size,from_what)#改变文件指针的位置,from_what的值:0表示开头,1表示当前位置,2表示文件结尾;例:seek(x,0)表示从开头移动x个字符;seek(x,1)表示从当前位置往后移动x个字符;seek(-x,2)表示从文件结尾向前移动x个字符;
open(filename,openmode)
#r:以只读方式打开文件,文件指针在文件开头
#rb:以二进制格式打开一个只读文件,指针在文件开头
#r+:打开一个文件用于读写,文件指针在头部
#rb+:以二进制格式打开一个读写文件,指针在文件开头
#w:以写入方式打开文件,文件存在则原有内容被删除,从头开始编辑,反之创建新文件.
#w+:以读写方式打开文件,文件存在则原有内容被删除,从头开始编辑,反之创建新文件.
#wb+:以二进制格式打开文件用于写入,文件存在则原有内容被删除,从头开始编辑,反之创建新文件.
#a:打开文件用于追加,文件存在则文件指针在文件末尾,不存在则创建新文件写入.
#ab:以二进制格式打开一个文件用于追加,文件存在则文件指针在文件末尾,不存在则创建新文件写入.
#a+:打开一个文件用于读写,文件存在则文件指针在文件末尾,不存在则创建新文件写入.
#ab+:以二进制格式打开一个文件用于追加,文件存在则文件指针在文件末尾,不存在则创建新文件写入.
import codecs
f=codecs.open('filename','w+','utf-8')以utf-8的编码打开文件
```
---
## 数据类型相关
### 操作符类型
> 比较操作符(<,<=,>,>=,!=,==)
> 算数操作符(+,-,*,/,%,**,//),%求余数,**代表幂运算
> 逻辑操作符(and,or,not)
> and是两边都为真则为真;or一边为真则为真,两边都为假则为假;not求反
> 赋值操作符(=)
> 三元操作符(x if 条件 else y)条件为真取x的值,反之取y的值
> print(10 if True < False else 8)#结果为8
* 优先级
> 一级: **(幂运算)
> 二级: +,-(正负号)
> 三级: +,-,*,/,//(算数操作符)
> 四级: <,<=,>,>=,==,!=(比较操作符)
> 五级: not,and,or(逻辑运算符)
> 一级最高,五级最低
---
### 类型检测转换
```python
#类型检测函数type()
print(type(0.12)) #结果为<class float>
#类型判断函数isinstance()
print(isinstance(123,int)) #结果为True,类型一致,反之则不一致
#类型转换(python的小数转整数会把小数点后的数直接舍弃,不会四舍五入)
print(int(5.21)) #结果为5
#布尔类型
True #为真,其代表的值为1
False #为假,其代表的值为0
```
---
### 数据类型和注释
> python无需不用对变量声明,就可以使用,会根据用户输入的数据自动确定类型
> 数据类型:int整型,float浮点型,str字符型,声明编码方式:# _*_ coding:utf-8 _*_
> 单行注释以#号开头
> 多行注释以三对单引号或双引号,
> 在输出时加上'r'可以使转义字符不转义,例:\n不再是换行
> 使用三对单引号或双引号的前边加变量名可以进行赋值操作,不改变格式
> 标准数据类型(列表,字典,元组,集合都可以使用数组的下标,进行数据查找输出)
---
### 错误类型及检测
```python
AssertionError #断言语句失败
AttributeError #尝试访问未知的对象属性
IndexError #索引超出序列的范围
KeyError #字典中查找一个不存在的关键字
NameError #尝试访问一个不存在的变量
OSError #操作系统产生的异常
SyntaxError #python语法错误
TypeError #不同类型间的无效操作
ZeroDivisionError #除数为零,除数不能不能为零
# 保留异常信息
import traceback
try: #可能出现异常的代码块
pass
except: #出现异常时执行的代码块
traceback.print_exc() #出错时不停止,执行结束时打印错误信息
else: #没有异常时执行的代码块
pass
finally: #不管try有没有异常,都会执行finally
pass
#else和finally语句可省略
```
---
### 代码规范检查
```python
安装pip install pycodestyle
pycodestyle --show-source --show-pep8 filename #检查代码规范
#代码格式化工具autopep8
安装pip install autopep8
autopep8 filename #将修改后的代码输出到控制台
autopep8 --in-place fileneme #直接修改源文件
```
---
## 自动导出当前环境中所安装的包及版本
```python
pip freeze > requirements.txt
```
# 免费查询ip归属地
```
# 使用get请求
http://freeapi.ipip.net/218.192.3.42
http://ip-api.com/json/218.192.3.42
```
# 升级pip
```sh
# Windows下升级
python -m pip install -U pip
# Linux/Mac下升级
pip install -U pip
```
# python关键字
```python
'False''None','True','and','as','assert','break','class','continue','def','del','elif','else','except','finally','for','from','global','if','import','in','is','lambda','nonlocal','not','or','pass','raise','return','try','while','with','yield'
```
---
# 导入包或者库
```python
import 'name' #导入一个模块
from 'name' import 'name1' #导入某个模块的子模块
from 'name' import * #导入一个模块的所有内容
dir(): #查看模块内定义的所有名称
#导入的自定义库或者函数需要在函数尾部添加if语句
if __name__ == '__main__': #判断函数名字是否等于本身,不是则被调用,是则运行函数
function()
#自建python包,要在python包内创建'__init__.py'文件
```
---
# 查询内置函数或帮助
```python
dir(__builtins__)
#函数帮助
help(print)#结果为print函数的用法
```
---
# Python库用法
## python虚拟环境
### Anaconda用法
- Anaconda下载地址https://www.anaconda.com/download/
- Miniconda下载地址https://docs.conda.io/en/latest/miniconda.html
- linux下载链接
```sh
wget https://repo.anaconda.com/miniconda/Miniconda3-py311_24.1.2-0-Linux-x86_64.sh
sudo bash Miniconda3-py311_24.1.2-0-Linux-x86_64.sh
```
- 清华大学的conda源https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/
- 配置清华大学conda源
```
channels:
- defaults
show_channel_urls: true
default_channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch-lts: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
```
```sh
# conda命令用法
# 删除虚拟环境
conda env remove --name myenv
# 删除指定路径的虚拟环境
conda env remove -p /完整/路径/到/环境
# 查看虚拟环境
conda env list或conda info --envs
# windows下在用户目录下创建conda配置文件,文件名.condarc,linux下会自动创建无需手动创建
conda config --set show_channel_urls yes
# 清除索引缓存
conda clean -i
> 更改conda源后使用
# 创建一个名为envname的虚拟环境,并安装python=3.6
conda create --name envname python=3.6
> 默认在用户目录下创建
# 指定目录创建环境,在d盘virtual目录下创建名为tensorflow的虚拟环境
conda create --prefix=d:\virtual\tensorflow
> 使用prefix时,不能指定虚拟环境名称,给定的路径最后一个目录即为虚拟环境名称
# 取消自动激活conda环境
conda config --set auto_activate_base false
# 在conda环境中安装包虚拟环境名称可以不用指定
conda install --name envname package1 package2
# 在conda环境中卸载包remove和uninstall效果一样
conda remove --name envname package1 package2
# 查询conda包可以不输入完整的包名
conda search packagename
# 查询指定conda包的可用版本
conda search packagename==
# 列出conda包
conda list
# 更新conda包
conda update --name envname package1 package2### anaconda用法
```
### pipx用法
### venv用法
### uv用法
```sh
# 脚本安装
wget -qO- https://astral.sh/uv/install.sh | sh
# pip或pipx安装
pipx install uv
#脚本安装更新
uv self update
# pip安装更新
pip install --upgrade uv
# uv命令自动补全选择对应的终端
# Determine your shell (e.g., with `echo $SHELL`), then run one of:
echo 'eval "$(uv generate-shell-completion bash)"' >> ~/.bashrc
echo 'eval "$(uv generate-shell-completion zsh)"' >> ~/.zshrc
echo 'uv generate-shell-completion fish | source' >> ~/.config/fish/config.fish
echo 'eval (uv generate-shell-completion elvish | slurp)' >> ~/.elvish/rc.elv
# uvx命令自动补全
# Determine your shell (e.g., with `echo $SHELL`), then run one of:
echo 'eval "$(uvx --generate-shell-completion bash)"' >> ~/.bashrc
echo 'eval "$(uvx --generate-shell-completion zsh)"' >> ~/.zshrc
echo 'uvx --generate-shell-completion fish | source' >> ~/.config/fish/config.fish
echo 'eval (uvx --generate-shell-completion elvish | slurp)' >> ~/.elvish/rc.elv
# 卸载uv
uv cache clean
rm -r "$(uv python dir)"
rm -r "$(uv tool dir)"
rm ~/.local/bin/uv ~/.local/bin/uvx
```
## 安装Jupyter笔记本
* 安装jupyter
`pip3 install jupyter-core`
`pip3 install jupyterlab`
`pip3 install jupyter`
`pip3 install notebook`
* 运行jupyter
`jupyter notebook`
* 升级jupyter
`pip3 install -U jupyter`
---
## nano ID库使用
```python
pip install nanoid
from nanoid import generate
generate() # => NDzkGoTCdRcaRyt7GOepg
generate(size=10) # => "IRFa-VaY2b"
generate('1234567890abcdef', 10) # => "4f9zd13a42"
from nanoid import non_secure_generate
non_secure_generate('1234567890abcdef', 10)
```
## requests库
### 查询公网ip
```python
import requests
requests.get('https://checkip.amazonaws.com').text.strip()
```
## random库生成随机数
```python
random.seed(s) #初始化随机数
random.random() #返回一个随机浮点数
randint(a,b) #返回一个a与b之间的随机整数
randrange(a,b,c) #返回一个a与b之间步长为c的随机整数
getrandbits(a) #返回一个a比特长的随机整数
uniform(a,b) #返回一个a与b之间的随机浮点数
choice(ls) #从序列中随机选取一个元素返回
shuffle(ls) #将序列ls的元素随机排列,返回随机排列后的新序列
```
---
## sys,os库调用系统api
```python
#时间模块time
time.time() #返回一个浮点数,以秒为单位,起始时间为1970年
time.ctime() #返回一个星期,月份为英语缩写,时分秒年的标准时间的字符串
time.gmtime() #返回一个计算机可处理的时间值
time.strftime(template,ts) #使用gmtime()获取计算机内部时间赋值給ts,使用template将时间格式化,%Y代表年份;%m月份;%d日期;%H小时(24h制);%I小时(12h制);%M分钟;%S秒;%B月份英语;%b月份英语缩写;%A星期英语;%a星期英语缩写;%p英语上/下午,返回一个使用模板格式化后的时间字符串
strptime() #函数与strftime()类似,返回一个计算机可识别的时间格式
time.sleep(s) #使用该函数可令程序暂停执行,时间为秒
perf_counter() #计时函数,即第一次调用到第二次或N次经历的时间,单位为秒,返回浮点数
#datatime模块
datetime.datetime.fromtimestamp(float-time).strftime("%Y-%m-%d %H:%M:%S")
#可以格式化time.time()函数产生的浮点数时间
```
---
## pysnooper库显示程序运行变量
```python
import pysnooper
#在函数前加
@pysnooper.snoop()
#将输出定位到本地文件:
@pysnooper.snoop('/my/log/file.log')
#查看一些非本地变量的值:
@pysnooper.snoop(variables=('foo.bar','self.whatever'))
#展示我们函数中调用函数的 snoop 行:
@pysnooper.snoop(depth=2)
#将所有 snoop 行以某个前缀开始,更容易定位和找到:
@pysnooper.snoop(prefix='ZZZ ')
```
---
## tk库创建GUI程序
```python
#pack()参数(包装)
fill属性(它表示某个控件在横轴方向或纵轴方向该怎么填充,到底要不要填满。):
若fill=X表示这个控件在横轴方向填满父父组件容器不留空白。
若fill=Y表示这个控件在纵轴方向填满父父组件容器不留空白。
若fill=BOTH表示这个控件在横纵轴方向都填满父父组件容器不留空白。
expand属性(它表示某个控件在fill那个方向要不要把空白的地方分配给它。):
若expand=True或者expand=1表示在fill那个方向把空白处都分给这个控件让它尽量占满。
若expand=False或者expand=0表示在fill那个方向有空也不给它。
side属性(它表示某个控件在在它可用的活动空间内,是往哪边停靠。):
若side=LEFT表示尽可能往左边停靠。
padx和pady属性:控件x轴和y轴的外边距
ipadx和ipady属性:控件x轴和y轴的内边距
anchor属性(它表示某个控件在容器里的摆放方式,是左还是右,是上还是下):
若anchor=N表示North尽可能往北面/上面停靠。
若anchor=S表示South尽可能往南面/下面停靠。
若anchor=W表示West尽可能往西边/左边停靠。
若anchor=E表示East尽可能往东边/右边停靠。
若anchor=NE表示NorthEast尽可能往东北边/右上角停靠。
若anchor=NW表示NorthWest尽可能往西北边/左上角停靠。
若anchor=SE表示SouthEast尽可能往东南边/右下角停靠。
若anchor=SW表示SouthWest尽可能往西南边/左下角停靠。
若anchor=CENTER尽可能往中心停靠。
grid()参数(网格)
row和column属性表示某个控件要放在第几行网格或第几列网格。下标都是从0开始计的。
rowspan和columnspan属性表示某个控件将会竖着跨几行或横着跨几列。
默认都是1
padx和pady属性同pack()的):表示某个控件的外边距,即控件边缘和这个控件所在容器之间的间距
ipadx和ipady属性同pack()的):它表示某个控件的内边距,即控件边缘和这个控件内容(文字图片什么的)的间距
sticky属性这个有点类似pack()的anchor它表示某个控件在网格里的摆放方式是左还是右是上还是下
#menu参数
add_cascade添加子菜单
add_ckeckbutton添加一个复选按钮
add_command添加命令
add_radiobutton添加radiobutton
add_separator添加分隔符
tk.resizable(0,0) #阻止窗口改变大小
tk.title('title') #设置窗口标题
tk.geometry('width x height') #设置窗口大小
tk.destroy()#关闭窗口
sw = tk.winfo_screenwidth() #获取屏幕宽度
sh = tk.winfo_screenheight() #获取屏幕高度
x = (sw-300)/2 #获取减去程序所占宽度后屏幕一半的宽度
y = (sh-400)/2 #获取减去程序所占高度后屏幕一半的高度
tk.geometry('300x400+%d+%d'%(x,y))#设置窗口大小和显示位置
#tkinter的ttk模快
from tkinter import ttk
ttk.Progressbar(options) #进度条
#参数
orient #指定进度条垂直vertical还是水平horizontal
length #指定进度条的长度
mode #指定模式determinate为确定模式,indeterminate不确定模式,不确定模式下进度条来回滚动
maximum #指定进度条最大值,默认为100
value #进度条当前的值
variable #如果指定,进度条的值会改为该变量的值
phase
#方法
start(interval=None) #进度自动增加,默认为50毫秒
setp(amount=None) #按amount递增进度条的值
stop() #停止所有start的自动增加
```
---
## turtle库画图
```python
turtle.screensize(canvwidth=None,canvheight=None,bg=None) #设置画布大小,参数分别为画布的宽(单位像素),高,背景颜色。
turtle.setup(width,height,startx,starty) #画布宽高,出现位置为屏幕xy轴
turtle.pensize() #设置画笔的宽度;
turtle.pencolor() #没有参数传入,返回当前画笔颜色,传入参数设置画笔颜色,可以是字符串如"green",也可以是RGB 3元组。
turtle.speed(speed) #设置画笔移动速度,画笔绘制的速度范围[0,10]整数,数字越大越快。
turtle.forward(distance) #向当前画笔方向移动distance像素长度
turtle.backward(distance) #向当前画笔相反方向移动distance像素长度
turtle.right(degree)#顺时针移动degree°
turtle.left(degree) #逆时针移动degree°
turtle.pendown() #移动时绘制图形,缺省时也为绘制
turtle.goto(x,y) #将画笔移动到坐标为x,y的位置
turtle.penup() #提起笔移动,不绘制图形,用于另起一个地方绘制
turtle.circle() #画圆,半径为正(负),表示圆心在画笔的左边(右边)画圆
setx( ) #将当前x轴移动到指定位置
sety( ) #将当前y轴移动到指定位置
setheading(angle) #设置当前朝向为angle角度
home() #设置当前画笔位置为原点,朝向东。
dot(r) #绘制一个指定直径和颜色的圆点
turtle.fillcolor(colorstring)#绘制图形的填充颜色
turtle.color(color1,color2)#同时设置pencolor=color1,fillcolor=color2
turtle.filling() #返回当前是否在填充状态
turtle.begin_fill() #准备开始填充图形
turtle.end_fill() #填充完成
turtle.hideturtle() #隐藏画笔的turtle形状
turtle.showturtle() #显示画笔的turtle形状
turtle.clear() #清空turtle窗口但是turtle的位置和状态不会改变
turtle.reset() #清空窗口重置turtle状态为起始状态
turtle.undo() #撤销上一个turtle动作
turtle.isvisible() #返回当前turtle是否可见
stamp() #复制当前图形
turtle.write(s [,font=("font-name",font_size,"font_type")]) #写文本s为文本内容font是字体的参数分别为字体名称大小和类型font为可选项font参数也是可选项
turtle.mainloop()或turtle.done() #启动事件循环 -调用Tkinter的mainloop函数。必须是乌龟图形程序中的最后一个语句。
turtle.mode(mode=None) #设置乌龟模式“standard”“logo”或“world”并执行重置。如果没有给出模式则返回当前模式。
turtle.delay(delay=None) #设置或返回以毫秒为单位的绘图延迟。
turtle.begin_poly() #开始记录多边形的顶点。当前的乌龟位置是多边形的第一个顶点。
turtle.end_poly() #停止记录多边形的顶点。当前的乌龟位置是多边形的最后一个顶点。将与第一个顶点相连。
turtle.get_poly() #返回最后记录的多边形。
```
---
## pyinstaller打包可执行文件工具
```python
pyinstaller -F filename #打包文件为可执行程序
#参数
--clean #清理打包过程中产生的临时文件
-F,--onefile #在dist文件夹中只生成独立的可执行程序
-D,--onedir #默认值,生成dist文件夹
-i 图标文件名 #指定打包程序的图标
```
---
## jieba库分词工具
```python
#1.精确模式(不存在冗余)
jieba.lcut(s) #s代表要分词的字符串,返回一个分词后的列表
#2.全模式(存在冗余)
jieba.lcut(s,cut_all=Ture) #精确模式加参数,是全模式
#3.搜索引擎模式(存在冗余)
jieba.lcut_for_search(s)
jieba.add_word(w)#向分词字典增加新词w,w代表字符串
#中文分词练习三国演义https://python123.io/resources/pye/threekingdoms.txt
#英文分词练习https://python123.io/resources/pye/hamlet.txt
#wordcloud库使用(词云工具)
w=wordcloud.WordCloud(options)
#创建对象,参数有:
width,height #指定输出图像宽度和高度,默认生成大小为400x200;
min_font_size,max_font_size #指定字体大小,最小默认4号,最大根据高度自动调节;
font_step #指定字体字号间步进的间隔,默认为1
font_path #指定字体文件路径,默认为None
max_words #指定词云显示的最大单词数量,默认为200
stop_words #指定词云排除词列表
mask #指定词云形状,默认为矩形,使用方法:
from scipy.misc import imread
mk=imread('形状类型图片,背景必须为白色') #读取形状图片
mask=mk #将mk传递给mask参数
background_color #指定词云图片背景颜色,默认为黑色
w.generate(txt) #向对象中加载文件
w.to_file(filename) #将词云输出为图像文件,png或jpg格式,
#词云练习文件
#https://python123.io/resources/pye/新时代中国特色社会主义.txt
#https://python123.io/resources/pye/关于实施乡村振兴战略的意见.txt
```
---
## PyQt5库创建GUI程序
```python
pip3 install PyQt5
```
---
## rrdtool库生成数据图
```python
pip3 install rrdtool
#报错缺少rrd.h文件,使用sudo apt install -y librrd-dev
```
## platform库获取系统版本信息
```python
platform.platform() #获取操作系统名称及版本号
platform.version() #获取操作系统版本号,
platform.architecture() #获取操作系统的位数,('32bit', 'ELF')
platform.machine() #计算机类型,'i686'
platform.node() #计算机名称,'XF654'
platform.processor() #计算机处理器信息,''i686'
platform.uname() #获取系统类型,名称,版本,版本号,系统架构
platform.python_version() #查看python版本
```
## psutil库获取系统信息
```python
import os
os.path.expanduser('~') #获取用户主目录路径
os.path.enpandvars('$PAHT') #获取环境变量
#获取用户名
import getpass
getpass.getuser() #返回用户名
#获取主机名
import socket
socket.gethostname() #返回主机名
#官方帮助文档https://psutil.readthedocs.io/en/latest/
#pip安转报错解决方法
sudo apt install libssl-dev libcurl4-openssl-dev python3-dev
#cpu使用时间,percpu参数为True时显示多核cpu,返回二维列表.单核时返回元组
psutil.cpu_timespercpu = False)
user #正常进程在用户模式下执行所花费的时间; 在Linux上这还包括访客时间
system#在内核模式下执行的进程所花费的时间
idle: #闲置时间
#特定平台下:
nice (UNIX): #在用户模式下执行的niced优先级进程所花费的时间; 在Linux上这还包括guest_nice时间
iowait (Linux): #等待I / O完成所花费的时间
irq (Linux,BSD): #服务硬件中断所花费的时间
softirq (Linux): #服务软件中断所花费的时间
steal (Linux 2.6.11+): #在虚拟化环境中运行的其他操作系统所花费的时间
guest (Linux 2.6.24+): #在Linux内核的控制下为客户操作系统运行虚拟CPU所花费的时间
guest_nice (Linux 3.2.0+): #运行niced guest虚拟机所花费的时间Linux内核控制下的来宾操作系统的虚拟CPU
interrupt (Windows): #服务硬件中断所花费的时间类似于UNIX上的“irq”
dpc (Windows): #服务延迟过程调用DPC所花费的时间; DPC是以比标准中断低的优先级运行的中断。
#cpu使用率
psutil.cpu_percentinterval = Nonepercpu = False#返回单个cpu总体使用率
psutil.cpu_times_percentinterval = Nonepercpu = False#返回单核cpu各项使用率
#cpu个数
psutil.cpu_count(logical = True #显示逻辑cpu数量
psutil.cpu_count(logical = False) #排除超线程cpu后的cpu数量
len(psutil.Process().cpu_affinity()) #返回cpu的数量
#cpu统计信息
psutil.cpu_stats()
ctx_switches: #启动后的上下文切换次数(自愿+非自愿)。
interrupts: #自引导以来的中断数。
soft_interrupts:#自引导以来的软件中断次数。始终设置为0Windows和SunOS。
syscalls: #自引导以来的系统调用次数。始终设置为0Linux。
#cpu频率信息
psutil.cpu_freqpercpu = False
#系统负载
psutil.getloadavg#返回1分钟,5分钟,15分钟的系统平均负载
#物理内存信息
psutil.virtual_memory()
total: #总物理内存。
available#可以在没有系统进入交换的情况下立即提供给进程的内存。这是通过根据平台对不同的内存值求和来计算的,并且它应该用于以跨平台方式监视实际内存使用情况。
#其他指标:
used#使用的内存,根据平台的不同计算,仅供参考。总计 - 免费不一定匹配使用。
free#内存根本不被使用(归零),随时可用; 请注意,这并不反映可用的实际内存( 请改用)。总计 - 使用不一定与免费匹配 。
active UNIX #当前正在使用或最近使用的内存因此它在RAM中。
inactive UNIX #标记为未使用的内存。
buffers LinuxBSD#缓存文件系统元数据之类的东西。
cached (Linux,BSD): #缓存各种事物。
shared LinuxBSD #可由多个进程同时访问的内存。
slab Linux #内核数据结构缓存。
wired (BSD,macOS): #标记为始终保留在RAM中的内存。它永远不会移动到磁盘。
#交换内存信息
psutil.swap_memory()
total #总交换内存,以字节为单位
used #以字节为单位使用的swap内存
free #以字节为单位的自由交换内存
percent: #计算的百分比使用率(total-available)/total*100
sin #系统从磁盘交换的字节数(累计)
sout #系统从磁盘换出的字节数(累计)
#磁盘信息获取
psutil.disk_partitions() #返回多维列表,磁盘分区,挂在目录,文件系统,属性
psutil.disk_usage('挂载目录') #返回元组,分区大小,已使用,空闲,使用百分比
psutil.disk_io_counters() #磁盘总的io信息
read_count #读取次数
write_count #写入次数
read_bytes #读取的字节数
write_bytes #写入的字节数
#特定于平台的字段:
read_time :(除了NetBSD和OpenBSD之外的所有时间#从磁盘读取的时间(以毫秒为单位)
write_time :(除了NetBSD和OpenBSD之外#写入磁盘所花费的时间(以毫秒为单位)
busy_time :( LinuxFreeBSD #花在实际I / O上的时间以毫秒为单位
read_merged_countLinux #合并读取的数量请参阅iostats doc
write_merged_countLinux #合并写入次数请参阅iostats doc
psutil.disk_io_counters(perdisk=True) #所有分区的io信息
#网络信息获取
psutil.net_io_counters(pernic=False)#pernic为True时返回所有的网卡信息,
#将系统范围的网络I/O统计信息作为命名元组返回包括以下属性
bytes_sent#发送的字节数
bytes_recv#接收的字节数
packets_sent#发送的包数
packets_recv#接收的数据包数
errin #接收时的错误总数
errout #发送时的错误总数
dropin #丢弃的传入数据包总数
dropout #丢弃的传出数据包总数macOS和BSD总是0
psutil.net_connections(kind='inet')
#将系统范围的套接字连接作为命名元组列表返回。每个命名元组都提供7个属性
fd#套接字文件描述符。如果连接引用当前进程则可以将其传递给socket.fromfd 以获取可用的套接字对象。在Windows和SunOS上它始终设置为-1。
family#地址族AF_INETAF_INET6或AF_UNIX。
type#地址类型SOCK_STREAM或SOCK_DGRAM。
laddr#作为命名元组的本地地址或 AF_UNIX套接字的情况。对于UNIX套接字请参阅下面的注释。(ip,port)path
raddr#作为命名元组的远程地址或UNIX套接字的绝对地址。当远程端点未连接时您将获得一个空元组AF_INET *AF_UNIX。对于UNIX套接字请参阅下面的注释。(ip,port)path""
status#表示TCP连接的状态。返回值是psutil.CONN_ *常量之一字符串。对于UDP和UNIX套接字这总是如此 psutil.CONN_NONE。
pid#打开套接字的进程的PID如果可以检索否则None。在某些平台例如Linux此字段的可用性会根据进程权限需要root而更改。
#过滤条件
"inet" IPv4和IPv6
"inet4" IPv4的
"inet6" IPv6的
"tcp" TCP
"tcp4" TCP over IPv4
"tcp6" TCP over IPv6
"udp" UDP
"udp4" UDP over IPv4
"udp6" UDP over IPv6
"unix" UNIX套接字UDP和TCP协议
"all" 所有可能的系列和协议的总和
psutil.net_if_addrs
#将与系统上安装的每个NIC网络接口卡关联的地址作为字典返回该字典的键是NIC名称值是分配给NIC的每个地址的命名元组列表。每个命名元组包括5个字段
family#地址族AF_INET或AF_INET6 或者psutil.AF_LINK指MAC地址。
address#主NIC地址始终设置
netmask#网络掩码地址可能是None
#广播广播地址可能是None
ptp#代表“点对点”; 它是点对点接口通常是VPN上的目标地址。广播和ptp是互斥的。可能是None。
psutil.net_if_stats
#将有关每个NIC网络接口卡的信息作为字典返回该字典的键是NIC名称值是带有以下字段的命名元组
isup#指示NIC是否已启动并运行的bool。
duplex#双工通信类型; 它可以是NIC_DUPLEX_FULLNIC_DUPLEX_HALF或者 NIC_DUPLEX_UNKNOWN。
speed#以兆位MB表示的NIC速度如果无法确定例如'localhost'它将被设置为0。
mtu##NIC的最大传输单位以字节为单位。
#传感器信息获取
psutil.sensors_temperatures(fahrenheit=False)
#返回硬件温度。每个条目都是一个命名元组代表某个硬件温度传感器它可能是CPU硬盘或其他东西具体取决于操作系统及其配置。除非设定为 华氏温度否则所有温度均以摄氏度表示True。如果OS不支持传感器则返回空的dict。
psutil.sensors_fans
#返回硬件风扇速度。每个条目都是一个代表某个硬件传感器风扇的命名元组。风扇速度以RPM每分钟转数表示。如果OS不支持传感器则返回空的dict。
psutil.sensors_battery
#将电池状态信息作为命名元组返回包括以下值。如果未安装电池或无法确定指标None 则返回。
百分比:#电池剩余百分比。
secsleft#电池电量耗尽前剩余的秒数的粗略近似值。如果连接了交流电源线,则设置为 psutil.POWER_TIME_UNLIMITED。如果无法确定它被设置为 psutil.POWER_TIME_UNKNOWN。
power_plugged#True如果连接了交流电源线False 如果没有或者None无法确定。
#其他系统信息获取
psutil.boot_time
#返回自1970/01/01-00:00:00到当前的时间,是一个浮点数。
psutil.users
#将当前在系统上连接的用户作为命名元组列表返回,包括以下字段:
user#用户的名称。
terminal#与用户关联的tty或伪tty如果有的话else None。
host#与条目关联的主机名(如果有)。
start#创建时间为浮点数,以纪元为单位,以秒为单位。
pid#登录过程的PID如sshdtmuxgdm-session-worker...。在Windows和OpenBSD上它始终设置为None。
psutil.pids
#返回当前运行的PID的排序列表。迭代所有过程并避免竞争条件process_iter() 应该是首选。
psutil.process_iterattrs = Nonead_value = None
#返回一个迭代器Process为本地计算机上的所有正在运行的进程生成一个类实例。每个实例只创建一次然后缓存到内部表中每次生成一个元素时都会更新。Process检查缓存实例的身份以便在另一个进程重用PID时保证安全在这种情况下缓存的实例会更新。这比psutil.pids()迭代过程更受欢迎。返回进程的排序顺序取决于它们的PID。 attrs和ad_value具有与in中相同的含义Process.as_dict()。如果指定了attrs则Process.as_dict()在内部调用并将生成的dict存储为info附加到返回的属性Process 实例。如果attrs是一个空列表它将检索所有进程信息
psutil.pid_existspid
#检查当前进程列表中是否存在给定的PID。这比做得快应该是首选。pid in psutil.pids()
psutil.wait_procsprocstimeout = Nonecallback = None
#等待Process实例列表终止的便捷功能。返回一个元组指示哪些进程已经消失哪些进程仍然存在。该走的人都会有一个新的 返回码属性,指示进程的退出状态(将是对不属于我们的孩子的过程)。 是一个函数,当一个正在等待的进程被终止并且一个实例作为回调参数传递时被调用。一旦所有进程终止或发生超时(秒),此函数将立即返回 。如果发生超时,则不会引发 不同的情况。典型的用例可能是:(gone,alive)NonecallbackProcessProcess.wait()TimeoutExpired
#将SIGTERM发送到进程列表,给他们一些时间来终止,将SIGKILL发送给那些还活着的人
```
---
# Django框架
> 安装命令pip3 install Django
> 创建项目django-admin startproject 项目名称
> 创建应用程序:python3 manage.py startapp 应用名称
> 告诉Django更改了应用模型:python3 manage.py makemigrations 应用程序名称
> 将要执行的更改输出到控制台:python3 manage.py sqlmigrate 应用程序名称 次数(例如0001)
> 检查要更改数据库的内容是否有问题:python3 manage.py check
> 为模型改变生产迁移文件python3 manage.py makemigrations
>
> 执行更新迁移数据库:python3 manage.py migrate
>
> 运行开发服务器python3 manage.py runserver
> 指定服务器ip或端口:python3 manage.py runserver 0.0.0.0:8080
> 交互式python shellpython3 manage.py shell(为Django提供了site/settings.py文件的python导入路径)
>
> * 配置数据库
> 1.postgresql数据库需要使用psycopg2驱动
> 2.mysql数据库需要使用mysqlclient驱动
> 3.orcale数据库需要使用cx_Orcale驱动
---
# 爬虫工具安装
一.请求库安装requests
pip安装:pip3 install requests
验证安装:在python命令行输入import requests,没报错则安装成功
二.自动化测试工具Selenium
pip安装:pip3 install selenium
验证安装:在python命令行输入import selenium,没报错则安装成功
三.浏览器驱动软件
1.谷歌驱动安装Chromedriver
官方网站:https://sites.google.com/a/chromium.org/chromedriver
(查找对应浏览器版本的驱动)
下载地址:https://chromedriver.storage.googleapis.com/index.html
(1)移动文件到环境变量目录:sudo mv 文件所在位置 /usr/bin
(2)添加环境变量:vim ~/.profile
在文件末尾添加并保存export PATH = "$PATH:/文件所在位置"
重载配置文件:source ~/.profile
验证安装:在python命令行输入from selenium import webdriver,
test = webdriver.Chrome(),弹出空白谷歌浏览器则配置成功
2.火狐驱动安装GeckoDriver
下载地址:https://github.com/mozilla/geckodriver/releases
(1)移动文件到环境变量目录:sudo mv geckodriver /usr/bin
(2)添加环境变量:vim ~/.profile
在文件末尾添加并保存export PATH = "$PATH:/文件所在位置"
重载配置文件:source ~/.profile
验证安装:在python命令行输入from selenium import webdriver,
test = webdriver.Firefox(),弹出空白火狐浏览器则配置成功
3.无界面浏览器PhantomJS安装(selenium已取消对phantomjs的支持)
下载地址http://www.phantomjs.org/download.html
(1)将bin内的phantomjs文件移动到环境变量目录:sudo mv 文件所在位置 /usr/bin
(2)添加环境变量:vim ~/.profile
在文件末尾添加并保存export PATH = "$PATH:/文件所在位置"
重载配置文件:source ~/.profile
验证安装:在python命令行输入from selenium import webdriver,
test = webdriver.PhantomJS(),test.get('http://www.baidu.com'),
print(test.current_url),控制台输出http://www.baidu.com则配置成功
四.Web异步服务aiohttp安装
pip安装:pip3 install aiohttp
字符编码检测库cchardet,加速DNS解析库aiodns
pip安装:pip3 install cchardet aiodns
验证安装:在python命令行输入aiohttp,没报错则安装成功
五.解析库安装
1.安装lxml(支持html和xml解析)
pip安装 pip3 install lxml
验证安装:在python命令行输入import lxml,没报错则安装成功
2.安装Beautiful Soup(依赖于lxml库,解析库支持HTML和XML)
pip安装:pip3 install beautifulsoup4
验证安装:在python命令行输入from bs4 import BeautifulSoup,
soup = BeautifulSoup('<p>hello</p>','lxml'),print(soup.p.string)
控制台输出hello,则安装成功
3.安装pyquery(支持jQuery和css)
pip安装:pip3 install pyquery
验证安装:在python命令行输入import pyquery,没报错则安装成功
六.tesserocr安装(识别验证码)
下载地址:https://digi.bib.uni-mannheim.de/tesseract/
语言包地址:https://github.com/tessact-ocr/tessdata
安装命令:sudo apt install -y tesseract-ocr libtesseract-dev libleptonica-dev
安装git命令sudo apt install git
克隆语言包到本地git clone https://github.com/tesseract-ocr/tessdata.git
迁移到相关目录下sudo mv tessdata/* usr/share/tesseract-ocr/tessdata
添加环境变量vim ~/.profile在最后添加export TESSDATA_PREFIX=tessdata文件迁移目录路径
重载配置文件source ~/.profile
检查语言包tesseract --list-langs(chi_sim为简体中文)
安装tesserocr在命令行输入pip3 install tesserocr pillow
(如果报错,先执行sudo apt-get install python-dev python-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev)
验证安装tesseract在命令行输入tesseract 图片路径 保存文件名称 -l(指定语言包) eng(英文) && cat 结果文件名称
没报错则安装成功
验证tesserocr在python命令行输入import tesserocr,print(tesserocr.file_to_text('验证码图片名称')
没报错则安装成功
七.数据库安装
1.mysql安装(轻量级关系型数据库)
在命令行输入sudo apt updata,sudo apt install -y mysql-server mysql-client
登录mysql在命令行输入sudo mysql -uroot -p
查看mysql状态sudo service mysql status
修改mysql配置文件(可被远程访问)sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
注释此行:bind-address=127.0.0.1
(安装配置sudo mysql_secure_installation
第一项输n,第二项输密码,第三项输n,第四项输y,第五项输n,第六项输y)
2.MongoDB安装(是由c++编写的非关系型数据库)
在命令行输入(导入公钥)sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB49F368818C72E52529D4
创建apt源列表在命令行输入echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.0.list
更新apt源在命令行输入sudo apt update
安装mongodb在命令行输入sudo apt install -y mongodb-org
安装后运行mongodb在命令行输入sudo service mongod start
端口与路径配置在命令行输入mongod --port 27017 --dbpath /data/db(mongodb在27017端口运行,文件存放于/data/db目录)
进入mongodb在命令行输入mongo --port 27017
在mongodb模式下输入,创建用户名为admin,密码为123的用户,赋予最高权限
use admin
db.createUser({user:'admin',pwd:'123',roles:[{role:'root',db:'admin'}]})
修改mongodb配置文件在命令行输入sudo vim /etc/mongod.conf
修改net部分为(可被远程访问)
net:
port:27017
bindIp:0.0.0.0
修改security部分(权限认证配置)
security:
authorization:enabled
重启mongodb服务
3.Redis安装(基于内存的高效非关系型数据库)
在命令行输入sudo apt install -y redis-server
修改配置文件sudo vim /etc/redis/redis.conf
注释此行(可被远程访问)bind 127.0.0.1
取消此行注释(设置密码,foobared即当前密码)requirepass foobared
(快速查找字符串在vim命令行模式下输入:/要查询的字符串)
重启Redis服务sudo /etc/init.d/redis-server restart
八.存储库安装
1.PyMySQL安装(python操作mysql的库)
pip安装pip3 install pymysql
验证安装,在python命令行输入import pymysql(不报错则安装成功)
2.PyMongo安装(python与mongodb交互的库)
pip安装pip3 install pymongo
验证安装,在python命令行输入import pymongo(不报错则安装成功)
3.redis-py安装(python与redis交互的库)
pip安装pip3 install redis
验证安装,在python命令行输入import redis(不报错则安装成功)
4.Redisdump安装(redis数据导入/导出工具,依赖于Ruby)
在命令行输入sudo apt install -y ruby-full,sudo gem install redis-dump
验证安装,在命令行输入redis-dump,redis-load
九.web库的安装
1.flask(轻量级web服务程序,用于做API服务)
pip安装pip3 install flask
验证安装,在python命令行输入
from flask import Flask
app=Flask(__name__)
@app.route("/")
def hello():
return "hello world"
if __name__=="__main__":
app.run()
在浏览器输入127.0.0.1:5000,看到hello world则成功
(利用flask与redis维护动态代理池和cookies池)
2.tornado安装(支持异步的web框架)
pip安装pip3 install tornado
验证安装,在python命令行输入
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("hello world!")
def make_app():
return tornado.web.Application([(r"/",MainHandler),])
if __name__=="__main__":
app=make_app()
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
在浏览器输入127.0.0.1:8888,看到hello world则成功
(利用tornado与redis搭建ADSL拨号代理池)
十.APP爬取相关库安装
1.Charles安装(网络抓包工具,抓取移动端)
下载地址https://www.charlesproxy.com/download
添加apt公钥wget -q -O - https://www.charlesproxy.com/packages/apt/PublicKey | sudo apt-key add -
添加存储库到apt源sudo sh -c 'echo deb https://www.charlesproxy.com/packages/apt/ charles-proxy main > /etc/apt/sources.list.d/charles.list'
更新apt源sudo apt update
开始charles安装sudo apt install charles-proxy
打开charles,点击proxy->proxy settings打开代理设置,代理端口自定义
打开一台与当前安装charles在同一局域网内的手机,配置手机代理
服务器地址为安装charles电脑的IP,端口为charles配置的端口,点击保存
PC端会弹出窗口是否信任该设备,点击allow即可
在PC端点击help->ssl proxying->install charles root...Browser,弹窗后点击OK
在手机端浏览器输入chls.pro/ssl,弹出证书安装页面,点击安装
2.mitmproxy安装(支持http和https的抓包程序)
pip安装pip3 install mitmproxy
3.Appium安装(移动端自动化测试工具)
3.1安装java-jdk
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer
sudo apt-get update
sudo apt-get install openjdk-8-jdk
配置环境变量sudo vim ~/.profile
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
source ~/.profile
3.2安装android-sdk
wget https://dl.google.com/android/android-sdk_r24.2-linux.tgz
tar -xvzf android-sdk_r24.2-linux.tgz
sudo mv android-sdk-linux /usr/local/Android-SDK
配置环境变量sudo vim ~/.profile
export ANDROID_HOME=/usr/local/Android-SDK
export PATH=${ANDROID_HOME}/:${ANDROID_HOME}/tools:${ANDROID_HOME}/build-tools/28.0.2:${ANDROID_HOME}/platform-tools:$PATH
source ~/.profile
验证安装,在命令行输入android,安装对应sdk工具包
3.3安装nodejs
sudo wget https://nodejs.org/dist/v10.10.0/node-v10.10.0-linux-x64.tar.xz
tar -xvf node-v10.10.0-linux-x64.tar.xz
sudo mv node-v10.10.0-linux-x64 /usr/local/bin/node-v10.10.0
配置环境变量sudo vim ~/.profile
export NODE_HOME=/usr/local/bin/node-v10.10.0
export PATH=$NODE_HOME/bin:$PATH
export NODE_PATH=$NODE_HOME/lib/node_modules
source ~/.profile
3.4安装appium
在命令行输入npm install -g appium
(报错解决方法npm install appium-chromedriver@4.4.0 --ignore-scripts)
(或使用sudo npm install -g appium --registry=https://registry.npm.taobao.org)
验证安装,在命令行输入npm install -g appium-doctor,appium-doctor
十一.爬虫框架安装
1.pyspider安装
确保系统安装了lxml和pycurl
pip3 install lxml
sudo apt-get install libgnutls28-dev
pip3 install pycurl
pip安装pip3 install pyspider
验证安装,在命令行输入pyspider all,在浏览器输入localhost:5000
2.scrapy安装
sudo apt install -y build-essential python3-dev libssl-dev libffi-dev libxml2 libxml2-dev libxslt1-dev zlib1g-dev
pip3 install Scrapy
验证安装,在命令行输入scrapy,出现版本信息和帮助则安装成功
2.1Scrapy-Splash安装
sudo apt install -y docker docker.io
sudo docker run -p 8050:8050 scrapinghub/splash
pip3 install scrapy-splash
2.2Scrapy-Redis安装
pip3 install scrapy-redis
验证安装,在python命令行输入import scrapy_redis
十二.部署相关库docker安装(分布式爬虫部署)
阿里云安装脚本sudo curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh -
Daocloud安装脚本sudo curl -sSL http://get.daocloud.io/docker | sh
官方安装脚本sudo curl -sSL http://get.docker.com/ | sh
官方安装文档教程https://docs.docker.com/install/linux/docker-ce/ubuntu/#prerequisites
卸载旧版sudo apt-get remove docker docker-engine docker.io containerd runc
更新apt源sudo apt-get update
允许apt通过https使用存储库
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
添加秘钥curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
设置存储库
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
安装docker加速器
官方安装文档http://guide.daocloud.io/dcs/daocloud-9153151.html
安装脚本sudo curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
十三.scrapyd安装(部署与运行scrapy项目
1.安装scrapyd执行sudo pip3 install scrapyd
创建/etc/scrapyd/scrapyd.conf
sudo mkdir /etc/scrapyd | sudo touch /etc/scrapyd/scrapyd.conf
在scrapyd.conf文件添加一下内容
[scrapyd]
eggs_dir = eggs
logs_dir = logs
items_dir =
jobs_to_keep = 5
dbs_dir = dbs
max_proc = 0
max_proc_per_cpu = 10
finished_to_keep = 100
poll_interval = 5.0
bind_address = 0.0.0.0
http_port = 6800
debug = off
runner = scrapyd.runner
application = scrapyd.app.application
launcher = scrapyd.launcher.launcher.Launcher
webroot = scrapyd.website.Root
[services]
schedule.json = scrapyd.webservice.Schedule
cancel.json = scrapyd.webservice.Cancel
addversion.json = scrapyd.webservice.AddVersion
listprojects.json = scrapyd.webservice.ListProJects
listversions.json = scrapyd.webservice.ListVersions
listspiders.json = scrapyd.webservice.ListSpiders
delproject.json = scrapyd.webservice.DeleteProJect
delversion.json = scrapyd.webservice.DeleteVersion
listjobs.json = scrapyd.webservice.ListJobs
daemonstatus.json = scrapyd.webservice.DaemonStatus
配置文件修改官方参考文档https://scrapyd.readthedocs.io/en/stable/config.html#example-configuration-file
后台运行scrapyd命令
2.访问认证(安装nginx)
sudo apt install -y nginx
修改配置文件/etc/nginx/nginx.conf增加一下内容
http {
server {
listen 6801;
location / {
proxy_pass http://127.0.0.1:6800/;
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/conf.d/.htpasswd;
}
}
}
安装htpasswd命令
sudo apt install -y apache-utils
在/etc/nginx/conf.d目录下创建admin用户执行htpasswd -c .htpasswd admin输入密码
重启nginx服务sudo nginx -s reload
3.scrapyd-client安装
使用pip安装sudo pip3 install scrapyd-client
验证安装,在命令行输入scrapyd-deploy -h
4.scrapyd-API安装
pip3 install python-scrapyd-api
验证安装,在python命令行输入
from scrapyd_api import ScrapydAPI
scrapyd = ScrapydAPI('http://localhost:6800')
print(scrapyd.list_projects())
5.scrapyrt安装
pip3 install scrapyrt
6.gerapy(是一个scrapy分布式管理模块)
pip3 install gerapy
---
# python运维库
> 1、psutil是一个跨平台库https://github.com/giampaolo/psutil
> 能够实现获取系统运行的进程和系统利用率内存CPU,磁盘,网络等),主要用于系统监控,分析和系统资源及进程的管理。
> 2、IPyhttp://github.com/haypo/python-ipy,辅助IP规划。
> 3、dnspython(http://dnspython.org)Python实现的一个DNS工具包。
> 4、difflibdifflib作为Python的标准模块无需安装作用是对比文本之间的差异。
> 5、filecmp:系统自带,可以实现文件,目录,遍历子目录的差异,对比功能。
> 6、smtplib发送电子邮件模块
> 7、pycurl(http://pycurl.sourceforge.net)是一个用C语言写的libcurl Python实现 功能强大支持的协议有FTP,HTTP,HTTPS,TELNET等可以理解为Linux下curl命令功能的Python封装。
> 8、XlsxWriter:操作Excel工作表的文字数字公式图表等。
> 9、rrdtool:用于跟踪对象的变化,生成这些变化的走走势图
> 10、scapy(http://www.wecdev.org/projects/scapy/)是一个强大的交互式数据包处理程> 序,它能够对数据包进行伪造或解包,包括发送数据包,包嗅探,应答和反馈等功能。
> 11、Clam Antivirus免费开放源代码防毒软件pyClamad,可以让Python模块直接使用> ClamAV病毒扫描守护进程calmd。
> 12、pexpect:可以理解成Linux下expect的Python封装通过pexpect我们可以实现对ssh,ftp,passwd,telnet等命令行进行自动交互而无需人工干涉来达到自动化的目的。
> 13、paramiko是基于Python实现的SSH2远程安装连接支持认证及密钥方式。可以实现远程命令执行文件传输中间SSH代理等功能。相对于Pexpect,封装的层次更高更贴近SSH协议的功能官网地址http://paramiko.org(依赖Crypto,Ecdsa,Python开发包> python-devel)
> 14、fabric是基于Python实现的SSH命令行工具简化了SSH的应用程序部署及系统管理任务它提供了系统基础的操作组件可以实现本地或远程shell命令包括命令执行文件上传下载及完整执行日志输出等功能。Fabric在paramiko的基础上做了更高一层的封装操作起来更加简单。官网地址http://www.fabfile.org(依赖setuptools,Crypto,paramiko包支持)
> 15、CGIHTTPRequestHandler实现对CGI的支持。
> 16、ansible(http://www.ansibleworks.com/)一种集成IT系统的配置管理应用部署执行特定任务的开源平台。基于Python实现由Paramiko和PyYAML两个关键模块构建。Ansibl与Saltstack最大的区别是Ansible无需在被控主机上部署任何客户端默认直接通过SSH通道进行远程命令执行或下发功能。
> 17、YAML:是一种用来表达数据序列的编程语言。
> 18、playbook一个非常简单的配置管理和多主机部署系统。
> 19、saltstack(http://saltstack.com)是一个服务器基础架构集中化管理平台一般可以理解为简化版的puppet和加强版的func。Saltstack基于Python语言实现结合轻量级消息队列ZeroMQ,与Python每三方模块Pyzmq,PyCrypto,Pyjinja2,python-msgpack和PyYAML等构建。
> 20、func为解决集群管理监控问题需设计开发的系统管理基础框架。
# excel操作库
xlwings
openpyxl
xlsxwrite
win32com
pandas
# python操作修改pdf文件
PyPDF2库
# markdown
## 插入base64图片
```
![图片描述](data:image/jpeg;base64,base64字符串)
![图片描述](data:image/png;base64,base64字符串)
![图片描述][id]
[图片id]:data:image/jpeg;base64,base64字符串
```