python实用总结
Python3
常用工具
1. 命令行快速搭建本地http服务器
python3 -m http.server 8000
在命令行中输入此命令,就会在当前目录下搭建http服务器,可以通过访问http://localhost:8000/查看,
这样就可以用同一网段的设备从这个http服务器下载文件
2. python在程序里获取当前文件名
sys.argv[0]
3. 十六进制字符串转bytes
bytes.fromhex("1a2b3c4d5e6f7a8b")
(如果是python2: "1a2b3c4d5e6f7a8b".decode("hex"))
4. string 转 bytes
"12345678aa".encode('utf8')
5. bytes 转 int
int.from_bytes(b'1122aa','big') ('big'-大端,'little'-小端)
6. AES-CBC-128
from Crypto.Cipher import AES
import base64
key = bytes.fromhex("11223344556677881122334455667788")
iv = "1234567812345678".encode("utf-8")
buffer = "HelloWorld".encode('utf8')
buffer = buffer + b'000000' # 填充到16的整数倍
cryptor = AES.new(key, AES.MODE_CBC,iv)
encDate = cryptor.encrypt(buffer)
print("Enc: {0}".format(base64.b64encode(encDate)))
cryptor2 = AES.new(key, AES.MODE_CBC,iv) # 此处必须重新定义一个解密对象,如果使用上面的cryptor进行解密,会报错 decrypt() cannot be called after encrypt()
decDate = cryptor2.decrypt(encDate)
print(decDate)
7. 计算文件的MD5
import hashlib
def get_file_md5(file_path):
"""
获取文件md5值
:param file_path: 文件路径名
:return: 文件md5值
"""
with open(file_path, 'rb') as f:
md5obj = hashlib.md5()
md5obj.update(f.read())
_hash = md5obj.hexdigest()
return str(_hash).upper() # upper()转为大写
转自https://www.cnblogs.com/Cong0ks/p/11364660.html
校验文件:
#coding=utf-8
import hashlib
import sys
if len(sys.argv) == 3:
try:
if(sys.argv[2].lower() == 'md5'):
print (hashlib.md5(open(sys.argv[1],'rb').read()).hexdigest() )
elif(sys.argv[2].lower() == 'sha-1'):
print (hashlib.sha1(open(sys.argv[1],'rb').read()).hexdigest() )
elif(sys.argv[2].lower() == 'sha-256'):
print (hashlib.sha256(open(sys.argv[1],'rb').read()).hexdigest() )
elif(sys.argv[2].lower() == 'sha-512'):
print (hashlib.sha512(open(sys.argv[1],'rb').read()).hexdigest() )
else:
print ('[-]Please input a correct encryption algorithm.' )
except:
print ('[-]Please input a correct filename.' )
else:
print ('[*]Usage: python check_hash.py [Filename] [MD5|SHA-1|SHA-256|SHA-512]' )
转自https://blog.csdn.net/diyiday/article/details/80579547
8. os
需要在python文件头部引用os:
import os
判断文件是否存在:
os.path.exists(filePath) # 存在返回True;不存在返回False
由路径获取文件名:
os.path.basename(filePath) # C:/xxx/aaa.txt -> aaa.txt
删除文件:
os.remove(filePath)
9. filetype判断文件类型
安装:
pip3 install filetype
filetype支持的文件类型:
M3gp | Mp4 | M4v | Mkv | Mov | Avi | Wmv | Mpeg | Webm | Flv | Dwg | Xcf | Jpeg | Jpx | Png | Gif | Webp | Tiff | Cr2 | Bmp | Jxr | Psd | Ico | Heic | Dcm | Aac | Midi | Mp3 | M4a | Ogg | Flac | Wav | Amr | Woff | Woff2 | Ttf | Otf | Br | Rpm | Epub | Zip | Tar | Rar | Gz | Bz2 | SevenZ | Pdf | Exe | Swf | Rtf | Nes | Crx | Cab | Eot | Ps | Xz | Sqlite | Deb | Ar | Z | Lzop | Lz | Elf | Lz4 | Wasm
判断示例:
import filetype
#判断是不是需要的视频类型
def isVideo(filepath):
videoList = ["mp4", "m4v", "mkv", "webm", "mov", "avi", "wmv", "mpg", "flv"]
try:
fileTP = filetype.guess(filepath).extension
if fileTP in videoList:
return True
else:
return False
except:
return False
10. json 和 str 互转
import json
a = '{"name":"brian", "age":"sec"}'
#str->json (dict)
b = json.loads(a)
print(type(b)) # <class 'dict'>
print(b) # {'name': 'brian', 'age': 'sec'}
#json->str
c = json.dumps(b)
print(type(c)) # <class 'str'>
print(c) # {"name": "brian", "age": "sec"}
11. type
type函数返回类型是:type
>>> type(type(1))
<type 'type'>
那么肯定不能这么比较了
>>> type(1) == "int"
False
只能
>>> type(1) == type(2)
True
>>> type(1).__name__ == "int"
True
查看type源码:
class type:
__base__: type
__bases__: tuple[type, ...]
__basicsize__: int
__dict__: dict[str, Any]
__dictoffset__: int
__flags__: int
__itemsize__: int
__module__: str
__mro__: tuple[type, ...]
__name__: str
__qualname__: str
__text_signature__: str | None
__weakrefoffset__: int
@overload
def __init__(self, __o: object) -> None: ...
@overload
def __init__(self, __name: str, __bases: tuple[type, ...], __dict: dict[str, Any], **kwds: Any) -> None: ...
@overload
def __new__(cls, __o: object) -> type: ...
@overload
def __new__(cls: type[Self], __name: str, __bases: tuple[type, ...], __namespace: dict[str, Any], **kwds: Any) -> Self: ...
def __call__(self, *args: Any, **kwds: Any) -> Any: ...
def __subclasses__(self: Self) -> list[Self]: ...
# Note: the documentation doesn't specify what the return type is, the standard
# implementation seems to be returning a list.
def mro(self) -> list[type]: ...
def __instancecheck__(self, __instance: Any) -> bool: ...
def __subclasscheck__(self, __subclass: type) -> bool: ...
@classmethod
def __prepare__(metacls, __name: str, __bases: tuple[type, ...], **kwds: Any) -> Mapping[str, object]: ...
if sys.version_info >= (3, 10):
def __or__(self, __t: Any) -> types.UnionType: ...
def __ror__(self, __t: Any) -> types.UnionType: ...
此外,还可以使用 isinstrance()比较变量类型:
>>> isinstance(1,str)
False
>>> isinstance(1,int)
True
12. 获取本机ip
import socket
def extract_ip():
st = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
st.connect(('10.255.255.255', 1))
IP = st.getsockname()[0]
except Exception:
IP = '127.0.0.1'
finally:
st.close()
return IP
print(extract_ip())
13. 获取系统变量
os.environ.get("系统变量名")
打开ubuntu命令行:
export $TST=1
echo $TST
设置了系统变量 TST = 1
在python交互命令行:
>>> import os
>>> os.environ.get("TST")
"1"
14. python 搭建简单ftp服务器
pip3 install pyftpdlib
python3 -m ftpdlib -i [ip] -p [port] -d [dir] -D [debug] -u [username] -P [password]
# venv 环境里可以使用 ./venv/bin/python3 -m ftplib ...
start_ftp_server.sh
#!/bin/bash
has_lib=`pip3 list|grep pyftpdlib|grep -v grep`
if [ -z "${has_lib}" ];then
echo "not find pip3 lib pyftpdlib, try install it"
pip3 install pyftplib
fi
python3 -m pyftpdlib -i 0.0.0.0 -p 2021 -d /root/shell -D -u test -P test
ftp登录测试
# apt install ftp
ftp -p 0.0.0.0 2021
pip相关
1. pip freeze
这个命令可以查看已经安装的包及版本信息,当你要换电脑,或者朋友想复刻你已安装的包,又不想一个一个重新安装。这时就可以使用pip freeze > requirements.txt ,批量导出当前开发环境的包信息,然后安装requirements.txt依赖就行了。
pip freeze > requirements.txt
pip install -r requirements.txt
来源:公众号小白学视觉
故障处理
1. BlockingScheduler报错 apscheduler/util.py:95: PytzUsageWarning: The zone attribute is specific to pytz's interface;
添加时区:
from apscheduler.schedulers.blocking import BlockingScheduler
scheduler = BlockingScheduler(timezone="Asia/Shanghai")
chatgpt 经验
1. 使用字典统计每个key的数目
使用defaultdict
和partial
函数创建的counter
是一个可自动初始化的字典对象,可以在读取或更新不存在的key时自动创建一个默认值。在这种情况下,默认值是一个由partial(int)
函数返回的int类型的0。因此,在下面的代码中,当第一次为key 'aaa'更新计数器时,计数器的值被初始化为0,然后加1,结果为1:
from collections import defaultdict
from functools import partial
# 使用defaultdict和partial函数创建一个计数器,用于统计每个分组的记录数量
counter = defaultdict(partial(int))
counter['aaa'] += 1
print(counter['aaa']) # Output: 1
相比之下,使用普通的字典对象在读取或更新不存在的key时会抛出KeyError异常,需要显式地初始化或使用try-except语句来处理。例如:
# 使用普通的字典对象创建一个计数器,需要显式地初始化
counter = {}
key = 'aaa'
if key not in counter:
counter[key] = 0
counter[key] += 1
print(counter[key]) # Output: 1
# 或者使用try-except语句来处理KeyError异常
counter = {}
key = 'aaa'
try:
counter[key] += 1
except KeyError:
counter[key] = 1
print(counter[key]) # Output: 1
因此,在需要在字典对象上进行自动初始化的计数操作时,defaultdict
和partial
函数是更方便和可读性更好的选择。
2. python生成zip包
import zipfile
def zip_files(file_paths, zip_name):
# 创建一个新的zip文件
zipf = zipfile.ZipFile(zip_name, 'w', zipfile.ZIP_DEFLATED)
# 循环遍历文件路径列表,并将每个文件添加到zip文件中
for file_path in file_paths:
# 将文件添加到zip文件中,第二个参数是文件在zip中的路径(可以自定义)
zipf.write(file_path)
# 关闭zip文件
zipf.close()
# 要压缩的文件路径列表
files_to_zip = ['file1.txt', 'file2.txt', 'file3.txt']
# 压缩后的zip文件名
zip_file_name = 'archive.zip'
# 压缩文件
zip_files(files_to_zip, zip_file_name)
3. brotli压缩
#-*- coding:utf-8 -*-
import brotli
import json
import sys
import base64
def compress_json(json_str):
compressed_data = brotli.compress(json_str.encode('utf-8'))
return compressed_data
def decompress_json(data_bytes):
decompressed_data = brotli.decompress(data_bytes)
return decompressed_data
# 压缩后最好用base64转为str: base64.b64encode(data).decode("utf-8")
4. ssh远程登录
更详细内容,请参考Python使用Paramiko 实现ssh远程操作
import paramiko
host="远程ip"
username="ssh登录用户名"
password="ssh登录密码"
# 创建客户端
ssh = paramiko.SSHClient()
# 自动添加远程主机的 SSH 密钥
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy)
# 连接到远程主机
ssh.connect(hostname=host, username=username, password=password)
# 执行远程指令
command = "ls -la"
stdin, stdout, stderr = ssh.exec_command(command)
# 获取命令输出
output = stdout.read().decode("utf-8")
print(output)
ssh.close()
5. python 真随机数
import secrets
# 生成一个真正的随机整数
random_int = secrets.randbelow(100)
print(random_int)
# 生成一个真正的随机字节串
random_bytes = secrets.token_bytes(16)
print(random_bytes)
# 生成一个真正的随机十六进制字符串
random_hex = secrets.token_hex(16)
print(random_hex)
# 生成一个真正的随机URL安全字符串
random_url_safe = secrets.token_urlsafe(16)
print(random_url_safe)
6. gzip 压缩和解压缩
import gzip
import base64
def gzip_compress(data: str) -> bytes:
"""将字符串数据进行 GZIP 压缩,并返回压缩后的二进制数据。"""
binary_data = data.encode('utf-8')
compressed_data = gzip.compress(binary_data)
return compressed_data
def gzip_compress_base64(data: str) -> str:
"""将字符串数据进行 GZIP 压缩,并返回 Base64 编码后的字符串。"""
compressed_data = gzip_compress(data)
base64_data = base64.b64encode(compressed_data)
return base64_data.decode('utf-8')
def gzip_decompress(compressed_data: bytes) -> str:
"""将压缩后的二进制数据进行 GZIP 解压缩,并返回解压缩后的字符串。"""
decompressed_data = gzip.decompress(compressed_data)
return decompressed_data.decode('utf-8')
def gzip_decompress_base64(base64_data: str) -> str:
"""将 Base64 编码后的字符串进行解码和 GZIP 解压缩,并返回解压缩后的字符串。"""
compressed_data = base64.b64decode(base64_data)
return gzip_decompress(compressed_data)
7.zstd 压缩和解压缩
Zstandard (zstd) 压缩算法
比较简单的demo
import zstandard as zstd
import base64
def zstd_compress_b64(data):
"""使用zstd算法对data:str压缩并base64编码"""
binary_data = data.encode('utf-8')
compressor = zstd.ZstdCompressor()
compressed_data = compressor.compress(binary_data)
base64_data = base64.b64encode(compressed_data)
return base64_data.decode('utf-8')
def zstd_decompress_b64(data):
"""使用zstd算法对data进行base64解压缩并然后解zstd压缩"""
compressed_data = base64.b64decode(data)
decompressor = zstd.ZstdDecompressor()
decompressed_data = decompressor.decompress(compressed_data)
return decompressed_data.decode('utf-8')