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)

python实用总结的更多相关文章

  1. 批量下载网站图片的Python实用小工具(下)

    引子 在 批量下载网站图片的Python实用小工具 一文中,讲解了开发一个Python小工具来实现网站图片的并发批量拉取.不过那个工具仅限于特定网站的特定规则,本文将基于其代码实现,开发一个更加通用的 ...

  2. python实用库:PrettyTable 学习

    python实用库:PrettyTable 学习 PrettyTable说明 PrettyTable 是python中的一个第三方库,可用来生成美观的ASCII格式的表格,十分实用. 以下为官方介绍: ...

  3. Python实用日期时间处理方法汇总

    这篇文章主要介绍了Python实用日期时间处理方法汇总,本文讲解了获取当前datetime.获取当天date.获取明天/前N天.获取当天开始和结束时间(00:00:00 23:59:59).获取两个d ...

  4. Python 实用爬虫-04-使用 BeautifulSoup 去水印下载 CSDN 博客图片

    Python 实用爬虫-04-使用 BeautifulSoup 去水印下载 CSDN 博客图片 其实没太大用,就是方便一些,因为现在各个平台之间的图片都不能共享,比如说在 CSDN 不能用简书的图片, ...

  5. Python 实用脚本

    Python 实用脚本 脚本写的好,下班下得早!程序员的日常工作除了编写程序代码,还不可避免地需要处理相关的测试和验证工作. 例如,访问某个网站一直不通,需要确定此地址是否可访问,服务器返回什么,进而 ...

  6. python实用30个小技巧

    python实用30个小技巧 展开1.原地交换两个数字Python 提供了一个直观的在一行代码中赋值与交换(变量值)的方法,请参见下面的示例: In [1]: x,y = 10 ,20 In [2]: ...

  7. Python实用案例,Python脚本,Python实现批量加水印

    往期回顾 Python实现自动监测Github项目并打开网页 Python实现文件自动归类 Python实现帮你选择双色球号码 Python实现每日更换"必应图片"为"桌 ...

  8. Python实用案例,Python脚本,Python实现自动监测Github项目并打开网页

    往期回顾 Python实现文件自动归类 前言: 今天我们就利用Python脚本实现Github项目的更新,提醒方式是邮箱.直接开整~ 项目地址: https://github.com/kenwoodj ...

  9. Python实用案例,Python脚本,Python实现每日更换“必应图片”为“桌面壁纸”

    往期回顾 Python实现自动监测Github项目并打开网页 Python实现文件自动归类 Python实现帮你选择双色球号码 前言: 今天我们就利用python脚本实现每日更换"必应图片& ...

  10. Python实用案例,Python脚本,Python实现帮你选择双色球号码

    往期回顾 Python实现自动监测Github项目并打开网页 Python实现文件自动归类 前言: 今天我们就利用python脚本实现帮你选择双色球号码.直接开整~ 开发工具: python版本: 3 ...

随机推荐

  1. IDEA 2020 Maven编译问题:Error:(3, 32) java: 程序包org.springframework.boot不存在。

    今天在编译Maven项目时,包已经加载好了,也进行了打包,途中均没有报错.package -- Install -- test 都没用问题,但是,一致性run,就会一直报错,如图 检查打包位置,包也在 ...

  2. Spring源码阅读 ------------------- SpringFrameWork 5.2 +IDEA 部署其他坑位问题(二)

    一.地址下jar包无法下载问题   报错信息:      Could not get resource 'https://plugins.gradle.org/m2/org/asciidoctor/o ...

  3. 『手撕Vue-CLI』编码规范检查

    前言 这篇为什么是编码规范检查呢?因为这是一个很重要的环节,一个好的编码规范可以让代码更加清晰易读,在官方的 VUE-CLI 也是有着很好的编码规范的,所以我也要加入这个环节. 其实不管在哪个项目中, ...

  4. layui表格内可编辑下拉框

    表格内可编辑下拉框扩展自别人的表格内下拉框 一.列模板,这是列配置的templet字段需要使用的. 1.inputdiv,输入框覆盖在下拉框上面左半部.这个样式用来调整输入框和下拉框不会超出单元格. ...

  5. ASP.NET Core SignalR 概述

    什么是 SignalR? ASP.NET Core SignalR 是一个开放源代码库,可用于简化向应用添加实时 Web 功能. 实时 Web 功能使服务器端代码能够将内容推送到客户端. 适合 Sig ...

  6. 【论文笔记】SegNet

    [深度学习]总目录 SegNet是Cambridge提出旨在解决自动驾驶或者智能机器人的图像语义分割深度网络,开放源码,基于caffe框架.SegNet运用编码-解码结构和最大池化索引进行上采样,最主 ...

  7. 微软官方开源免费的Blazor UI组件库 - Fluent UI Blazor

    前言 今天大姚给大家分享一个由微软官方开源(MIT License).免费的Blazor UI组件库:Fluent UI Blazor. 全面的ASP.NET Core Blazor简介和快速入门 F ...

  8. 如何创建一个线程池,为什么不推荐使用Executors去创建呢?

    我们在学线程的时候了解了几种创建线程的方式,比如继承Thread类,实现Runnable接口.Callable接口等,那对于线程池的使用,也需要去创建它,在这里我们提供2种构造线程池的方法: 方法一: ...

  9. OOP第二阶段题集总结

    一.前言 知识点:考察继承和多态为多,其中还涉及迭代器的使用,在每个题集中都有一个综合性题目设计多方面知识点考试,有List类和HashMap的使用以及正则表达式的运用,并且注重考查设计,理解类与类之 ...

  10. 流程控制之case

    1.case语句作用 case和if一样,都是用于处理多分支的条件判断 但是在条件较多的情况,if嵌套太多就不够简洁了 case语句就更简洁和规范了 2.case用法参考 常见用法就是如根据用户输入的 ...