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)
python实用总结的更多相关文章
- 批量下载网站图片的Python实用小工具(下)
引子 在 批量下载网站图片的Python实用小工具 一文中,讲解了开发一个Python小工具来实现网站图片的并发批量拉取.不过那个工具仅限于特定网站的特定规则,本文将基于其代码实现,开发一个更加通用的 ...
- python实用库:PrettyTable 学习
python实用库:PrettyTable 学习 PrettyTable说明 PrettyTable 是python中的一个第三方库,可用来生成美观的ASCII格式的表格,十分实用. 以下为官方介绍: ...
- Python实用日期时间处理方法汇总
这篇文章主要介绍了Python实用日期时间处理方法汇总,本文讲解了获取当前datetime.获取当天date.获取明天/前N天.获取当天开始和结束时间(00:00:00 23:59:59).获取两个d ...
- Python 实用爬虫-04-使用 BeautifulSoup 去水印下载 CSDN 博客图片
Python 实用爬虫-04-使用 BeautifulSoup 去水印下载 CSDN 博客图片 其实没太大用,就是方便一些,因为现在各个平台之间的图片都不能共享,比如说在 CSDN 不能用简书的图片, ...
- Python 实用脚本
Python 实用脚本 脚本写的好,下班下得早!程序员的日常工作除了编写程序代码,还不可避免地需要处理相关的测试和验证工作. 例如,访问某个网站一直不通,需要确定此地址是否可访问,服务器返回什么,进而 ...
- python实用30个小技巧
python实用30个小技巧 展开1.原地交换两个数字Python 提供了一个直观的在一行代码中赋值与交换(变量值)的方法,请参见下面的示例: In [1]: x,y = 10 ,20 In [2]: ...
- Python实用案例,Python脚本,Python实现批量加水印
往期回顾 Python实现自动监测Github项目并打开网页 Python实现文件自动归类 Python实现帮你选择双色球号码 Python实现每日更换"必应图片"为"桌 ...
- Python实用案例,Python脚本,Python实现自动监测Github项目并打开网页
往期回顾 Python实现文件自动归类 前言: 今天我们就利用Python脚本实现Github项目的更新,提醒方式是邮箱.直接开整~ 项目地址: https://github.com/kenwoodj ...
- Python实用案例,Python脚本,Python实现每日更换“必应图片”为“桌面壁纸”
往期回顾 Python实现自动监测Github项目并打开网页 Python实现文件自动归类 Python实现帮你选择双色球号码 前言: 今天我们就利用python脚本实现每日更换"必应图片& ...
- Python实用案例,Python脚本,Python实现帮你选择双色球号码
往期回顾 Python实现自动监测Github项目并打开网页 Python实现文件自动归类 前言: 今天我们就利用python脚本实现帮你选择双色球号码.直接开整~ 开发工具: python版本: 3 ...
随机推荐
- 一次glide内存泄漏排查分析
glide是一款非常优秀的图片加载框架,目前很多项目在使用.提供了非常方法,在此,笔者就不一一列举了,可以到官网查找. 目前项目在做内存排查,因为是车机项目,之前开发的时候没有注意内存方面的问题(车机 ...
- margin-bottom:-1px无效的问题
在实现tab的时候,margin-bottom:-1px无效的问题 active的tab项,要指定他的border-top, 如: border-top: 1px solid #fff; border ...
- CICD详解之gitlab,Jenkins
持续集成概念 持续集成Continuous Integration 持续交付Continuous Delivery 持续部署Continuous Deployment 什么是持续集成: 持续集成是指开 ...
- 基于webapi的websocket聊天室(一)
上一次我已经讲了在webapi主机上面加入websocket中间件. 这次就更进一步,搭建一个websocket局域网聊天室. 传送门-->webapi添加添加websocket中间件 下一篇 ...
- 新一代AI搜索引擎神器推荐及效果测试:秘塔AI、天工AI、Perplexity等
新一代AI搜索引擎神器推荐效果测试:秘塔AI.天工AI.Perplexity等 0.前言: 搜索的核心:事物对象级别的搜索 回到搜索引擎本身,搜索引擎的早期出现是为了解决互联网上信息过载的问题.随着互 ...
- vite.config.js 无法使用__dirname的解决方法
__dirname 是commonjs规范的内置变量.如果使用了esm 是不会自动注入这个变量的. 在commonjs中,注入了__dirname,__filename, module, export ...
- 带你深入领略 Proxy 的世界
Proxy 是 es2015 标准规范加入的语法,很可能你只是听说过,但并没有用过,毕竟考虑到兼容的问题,不能轻易地使用 Proxy 特性. 但现在随着各个浏览器的更新迭代,Proxy 的支持度也越来 ...
- 记一次 .NET某工控WPF程序被人恶搞的 卡死分析
一:背景 1. 讲故事 这一期程序故障除了做原理分析,还顺带吐槽一下,熟悉我的朋友都知道我分析dump是免费的,但免费不代表可以滥用我的宝贵时间,我不知道有些人故意恶搞卡死是想干嘛,不得而知,希望后面 ...
- [HNOI2005] 狡猾的商人's 题解 (差分约束系统)
题目描述 给你一个\(n\)元一次方程,判断是否有解,方程给出的格式为 \(a-b=c\) 思路 这道题看上去是一道题目看上去就是判断给出条件是否有矛盾,所以就自然而然的可以使用带权并查集 但是因为我 ...
- PaddleOCR在 Linux下的webAPI部署方案
很多小伙伴在使用OCR时都希望能过采用API的方式调用,这样就可以跨端跨平台了.本文将介绍一种基于python的PaddleOCR识方案.喜欢的可以关注公众号,获取更多内容. 一. Linux环境下部 ...