Skip to content

ramwin/python-reference

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

tutorial

官网

Data Structures 基础类型

其实这个是Library Reference的内容

  1. Dictionaries
    使用del可以删除一个key
    list(d)可以把Dictionaries的keys按照插入的顺序输出 python3.7新特性. 使用时注意版本是否支持
    a_dict = {'foo': 'bar', 'my': 'a-only'}
    b_dict = {'foo': 'b', 'you': 'b-only'}
    a_dict.update(b_dict)
    >>> a_dict
    {'foo': 'b', 'my': 'a-only', 'you': 'b-only'}

Classes

  • 9.8 Iterators 定义一个iter会返回一个class(拥有__next__方法). 如果这个iterator自己有__next__方法,他可以返回self
    for的功能就是调用object的__iter__函数
  • 9.9 Generators 在函数里添加yield来使得这个函数变成iterators
    1. 自动创建__iter__, __next__函数
    2. 每次执行next时自动更新,免去手动设置self.data, self.index
    3. 不返回时,自动raise StopIteration
  • setup.py示例:

文档

from setuptools import setup
setup(
    # 必选
    name="包名",
    version="0.0.1",

    # 可选
    package_data = {
        '': ['*.png', '*.json'],  # 把包里面的png和json放入包
    },
    data_files=[('README.md', ['README.md'])],
    install_requires=[
        '<dependency_name> @ git+ssh://[email protected]/<user>/<repo_name>@<ref>',  # 依赖一个git仓库
    ]
)
  • 发布
python3 setup.py sdist bdist_wheel
twine upload dist/*

其他有用的包 Other Useful Library

airflow

github链接

beautifulsoup4 用来解析html文件

官网

captcha

示例 生成验证码

安装: pip install datetime-month

from month import XMonth
month = XMonth(2022, 11)
month.first_day()

diff-match-patch

比较文字不同

eth_typing

数字货币的类

faker use fake to create a lot of name of text

from faker import Faker
f = Faker('zh_cn')
print(f.name(), f.address(), f.text())
f.profile(['ssn', 'birthdate'])
$ faker address
$ faker name
$ faker password

[flake8] 检测python代码是不是满足pep8

flask 轻量级http服务器

转化尺寸

很好用的邮件客户端

  • ics 日历,行程 calendar
  • ipdb 断点来检测查看源码和运行状态

ipython

非常好用的交互式shell

  • ~/.ipython/profile_default/startup/ 下创建脚本可以默认import一些包

  • itchat 微信机器人

  • [iptools] 处理IP地址的包

>>> jmespath.search("foo.bar", {"foo": {"bar": "baz"}})
'baz'
  • jinja模板渲染
  • kafka 用于kafka的消息分发
    from kafka import KafkaConsumer
    consumer = KafkaConsumer('test',bootstrap_servers='192.168.1.191')
    for msg in consumer:
        print(msg)
    from kafka import SimpleProducer, SimpleClient
    kafka_client = SimpleClient('192.168.1.191')
    kafka_producer = SimpleProducer(kafka_client, async=False)
    kafka_producer.send_messages('test',b'test')
    

操作mysql数据库的包

  • 安装
sudo apt-get install python3-dev default-libmysqlclient-dev build-essential
sudo pip3 install mysqlclient
  • 运行
from MySQLdb.connections import Connection
db = Connection(db="test")
c = db.cursor()

res = c.execute("select * from pets");
print(c.fetchall())
>>> ((1, 'cat'), (2, 'cat'), (3, 'dogs'), (13, 'dog'), (14, 'dog'), (15, 'dog'), (21, 'dog'), (22, 'dog'))

res = c.execute("insert into pets values (null, 'dog')");
# 注意即使没有commit, 数据库id也会自增. 如果一次没有commit, 下次commit时,id就不是连续的了
db.commit()

# 使用连接池
https://github.com/discover-python-channel/youtube-content/blob/main/mysql_connection_pooling/python/import_fake_data.py

from mysql.connector import pooling
cnxpool = pooling.MySQLConnectionPool(pool_name="poolname", pool_size=20. autocommit=True, username...)
connection = cnxpool.get_connection()
cursor = connection.cursor()
cursor.execute(sql)

画图工具

imoprt matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4])  # 默认x轴是0, 1, 2, 3
plt.plot([2, 3, 4, 5], [2, 2, 3, 4])
plt.ylabel('some numbers')
plt.show()

mongoengine 把mongodb当作sql用。那你为什么不直接用mysql啊

from moviepy.video.io.ffmpeg_tools import ffmpeg_extract_subclip
# 截取前5秒的mp4文件
ffmpeg_extract_subclip("movie.mp4", 0, 5, targetname="test.mp4")

numpy

>>> numpy.linspace(0, 100, 3, dtype='int')
array([0, 50, 100])

有顺序的set, 实现原理其实就是用一个class内部保存一个list和一个set.
我尝试用dict来做(python现在dict的key是有顺序的),但是他的key不太方便做index顺序索引.
但是他内部是先判断是否存在,后插入的, 会不会遇到多线程导致key重复的问题呢?
会的, 参考代码 在sorted_set的add函数里加入一个time.sleep可以发现, 不加的话估计要很大的高并发才能出现

sudo pip3 install ordered-set

from ordered_set import OrderedSet
a = OrderedSet()
a.add(3)
a.update([5, 1, 4]) // OrderedSet([3, 5, 1, 4])
a.indexof(3)  // 0

openpyxl 处理excel

paramiko

github 文档 处理ssh的包,所以也能当sftp服务或者客户端。

  • 示例

    import paramiko
    
    client = paramiko.client.SSHClient()
    client.load_system_host_keys()
    client.connect(
        hostname="www.ramwin.com", port=22,
        username="*****", password="******")
    stdin, stdout, stderr = client.exec_command('pwd')
    error = stderr.read().decode("utf8")
    if error:
        raise Exception(error)
    print(stdout.read())

pdf2image: 把pdf转化成图片的库

测试代码

from pdf2image import convert_from_path
convert_from_path(pdf_path, output_folder=path, fmt='png')
images = convert_from_path(pdf_path)

pdfminer 解析pdf的包,好用

peewee 简单而轻量级的sqlite3 orm,和django很像

流程控制算法

包管理程序

获取系统信息

[pycharm]

  • 快捷键:
    • 界面工具查看
      • 命令行: alt+F12
    • 代码编辑
      • 折叠代码
      • Ctrl+B 或者 Ctal+click: 查看一个函数的定义
      • Ctrl+Q: 查看一个函数的文档
      • 查看文件结构: alt+7 or ctrl+F12
      • shift+F6: 重构函数名称,全局变化他的名字
    • 跳转
      • ctrl+shift+backspace: 查看上期编辑的地方

[pycrypto]

* 安装:
    * windows: 先去[下载visual c++ 9.0](http://aka.ms/vcpython27),然后再 `pip install pycrypto`

pydash

模拟lodash的

# pip install pydash
import pydash
pydash.get(obj, "a.b.1", 1)  # 默认返回1, 但是key存在为None会返回None

pydub 编辑mp3的包

  • 安装依赖: apt install libav-tools ffmpeg
  • 示例
  • 基础:
import math
from pydub import AudioSegment
song = AudioSegment.from_mp3('origin.mp3')
song[10*1000: 40*1000].export('target.mp3')

python虚拟化,通过制定python路径,来在服务器安装多个python

pyftpdlib ftp客户端和服务端

文档 添加-w参数可以允许写入

# 直接启动一个ftplib
python -m pyftpdlib  # 默认匿名登录, 端口号2121
python -m pyftpdlib --port=1223 --username=admin --password=123  -d ~/Downloads
# 后台启动
python script/启动ftp.py

PyPDF2 对中文支持不友好

pyperclip 控制系统剪切板

pyperclip.copy('ew') # 把ew放入剪切板

pysrt 控制srt字幕

f = open("模板.docx", "rb")
document = Document() or Document(f)
first_line = document.paragraphs[0]
first_line.text = "通知"
document.save("通知.docx")

python-dotenv

优点: 配置简单,接口清晰
缺点: 功能单一,只能返回字符串

  • 用来读取本地.env的配置(当前目录.env > ~/.env)
import os
from dotenv import load_dotenv, dotenv_values
load_dotenv()
CONFIG = {
    **os.environ(),
    dotenv_values(),
}
  • 设置环境变量
dotenv set EMAIL [email protected]
dotenv list

pytz 时区

PyWinMouse windows下操作鼠标

qiniu 七牛的接口

requests 发送http请求

rsa 使用rsa加密

用scp传输文件

from paramiko import SSHClient
from scp import SCPClient
with SSHClient() as ssh:
    ssh.load_system_host_keys()
    ssh.connect("ramwin.com", compress=True)  # https://github.com/jbardin/scp.py/pull/19
    with SCPClient(ssh.get_transport()) as scp:
        scp.put(<本地文件>, <远程路径>)
        scp.get(<远程路径>, <本地文件>, recursive=True)
pip install sortedcontainers
from sortedcontainers import SortedList
s1 = SortedList()
s1.add(0)
s1.update([2, 1, 3])

模仿redis的sorted set做的自动排序的set

sudo pip3 install sortedsets
>>> from sortedsets import SortedSet
>>> ss = SortedSet()
>>> for i in range(1, 1000):
>>>     ss['player' + str(i)] = i*10 if i % 2 else i*i
ss.by_score[470:511]
>>> ss.index('player20'), ss.index('player21')
400, 210
import time

from dotenv import dotenv_values, load_dotenv
from syncthing import Syncthing

load_dotenv()

folder = "目录id"
client = syncthing.Syncthing(dotenv_values()["APIKEY"])
client.db.scan(folder, sub="要同步的目录")
while client.db.completion(remote_device, folder) != 100:
    time.sleep(10)
  • srt因为缺少shift功能而改成用pysrt

virtualenv --system-site-packages -p /bin/python ENV
import word2vec
word2vec.word2phrase('./text8', './text8-phrases', verbose=True)
word2vec.word2vec('text8-phrases', 'text8.bin', size=100, verbose=True)
word2vec.word2clusters('text8', 'text8-clusters.txt', 100, verbose=True)
import word2vec
model = word2vec.load('text8.bin')
model.vocab
model.vectors.shape
model.vectors
model['狗'].shape
  • [flake8] 检测python代码是不是满足pep8

  • [xlrd] 读取excel数据

import xlrd
wb = xlrd.open_workbook(filename)
wb.sheets()  // [sheet0, sheet1, sheet2]
ws = wb.sheets()[0]
ws.visibility  // 2: hidden 0: show
for i in range(ws.nrows):
    print(ws.row(i)[0])  // first column

[yapf] 把python的代码格式化

About

veni vidi vici; master everything I had met in developing

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages