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 ...
随机推荐
- IDEA 2020 Maven编译问题:Error:(3, 32) java: 程序包org.springframework.boot不存在。
今天在编译Maven项目时,包已经加载好了,也进行了打包,途中均没有报错.package -- Install -- test 都没用问题,但是,一致性run,就会一直报错,如图 检查打包位置,包也在 ...
- Spring源码阅读 ------------------- SpringFrameWork 5.2 +IDEA 部署其他坑位问题(二)
一.地址下jar包无法下载问题 报错信息: Could not get resource 'https://plugins.gradle.org/m2/org/asciidoctor/o ...
- 『手撕Vue-CLI』编码规范检查
前言 这篇为什么是编码规范检查呢?因为这是一个很重要的环节,一个好的编码规范可以让代码更加清晰易读,在官方的 VUE-CLI 也是有着很好的编码规范的,所以我也要加入这个环节. 其实不管在哪个项目中, ...
- layui表格内可编辑下拉框
表格内可编辑下拉框扩展自别人的表格内下拉框 一.列模板,这是列配置的templet字段需要使用的. 1.inputdiv,输入框覆盖在下拉框上面左半部.这个样式用来调整输入框和下拉框不会超出单元格. ...
- ASP.NET Core SignalR 概述
什么是 SignalR? ASP.NET Core SignalR 是一个开放源代码库,可用于简化向应用添加实时 Web 功能. 实时 Web 功能使服务器端代码能够将内容推送到客户端. 适合 Sig ...
- 【论文笔记】SegNet
[深度学习]总目录 SegNet是Cambridge提出旨在解决自动驾驶或者智能机器人的图像语义分割深度网络,开放源码,基于caffe框架.SegNet运用编码-解码结构和最大池化索引进行上采样,最主 ...
- 微软官方开源免费的Blazor UI组件库 - Fluent UI Blazor
前言 今天大姚给大家分享一个由微软官方开源(MIT License).免费的Blazor UI组件库:Fluent UI Blazor. 全面的ASP.NET Core Blazor简介和快速入门 F ...
- 如何创建一个线程池,为什么不推荐使用Executors去创建呢?
我们在学线程的时候了解了几种创建线程的方式,比如继承Thread类,实现Runnable接口.Callable接口等,那对于线程池的使用,也需要去创建它,在这里我们提供2种构造线程池的方法: 方法一: ...
- OOP第二阶段题集总结
一.前言 知识点:考察继承和多态为多,其中还涉及迭代器的使用,在每个题集中都有一个综合性题目设计多方面知识点考试,有List类和HashMap的使用以及正则表达式的运用,并且注重考查设计,理解类与类之 ...
- 流程控制之case
1.case语句作用 case和if一样,都是用于处理多分支的条件判断 但是在条件较多的情况,if嵌套太多就不够简洁了 case语句就更简洁和规范了 2.case用法参考 常见用法就是如根据用户输入的 ...