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

摘自:Python获取本机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的数目

使用defaultdictpartial函数创建的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

因此,在需要在字典对象上进行自动初始化的计数操作时,defaultdictpartial函数是更方便和可读性更好的选择。

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')
posted @ 2021-06-09 09:01  BrianSun  阅读(148)  评论(0编辑  收藏  举报