晒晒我家小院子

0%

装饰器(装饰模式)

例子1

1
2
3
4
5
6
7
8
9
# 两层
def log(func):
def wrapper(*args, **kw):
print('log')
return func(*args, **kw)
return wrapper
@log
def test():
print('test')

使用csv操作excel、csv文件

Translation

  • 翻译官方文档-对应Python3.6
  • dialect 方言,这里指定格式为 csv

模块内容

  • functions
1
2
3
4
5
6
7
# csv.reader(csvfile, dialect='excel', **fmtparams)
# return: a list of strings
import csv
with open('eggs.csv', newline='') as csvfile:
spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')
for row in spamreader:
print(', '.join(row))
1
2
3
4
5
6
7
8
# csv.writer(csvfile, dialect='excel', **fmtparams)
# 写入是 a list of strings
import csv
with open('eggs.csv', 'w', newline='') as csvfile:
spamwriter = csv.writer(csvfile, delimiter=' ',
quotechar='|', quoting=csv.QUOTE_MINIMAL)
spamwriter.writerow(['Spam'] * 5 + ['Baked Beans'])
spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])
  • classes
1
2
3
4
5
6
7
8
9
10
11
12
# csv.DictReader(f)
import csv
with open('names.csv', newline='') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
print(row['first_name'], row['last_name'])
print(row)
# 公开接口
csvreader.__next__() # 让对象变为 iterable object,使用next(reader)
csvreader.dialect # 只读
csvreader.line_num # 行数(包含首行目录), 这与返回的记录数不同,因为记录可以跨越多行。
csvreader.fieldnames # 目录(如果有,没有则是第一行)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# csv.DictWriter(f)
import csv

with open('names.csv', 'w', newline='') as csvfile:
fieldnames = ['first_name', 'last_name']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames) # 指定目录

writer.writeheader() # 写入目录
writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'})
writer.writerow({'first_name': 'Lovely', 'last_name': 'Spam'})
writer.writerow({'first_name': 'Wonderful', 'last_name': 'Spam'})
# 公开接口
csvwriter.writerow(row)
csvwriter.writerows(rows) # an iterable of row objects
DictWriter.writeheader() # 写入目录(必须先在构造函数中指定)。
csvreader.dialect # 只读
  • exception
1
2
csv.Error
# 所有异常都是Error

Dialects的默认参数

1
2
3
4
5
6
7
# 一下参数了解,我们一般用不到,(不会去手动创建dialect对象)
Dialect.delimiter
# 分隔符,默认为 ','
Dialect.lineterminator
# 换行符 defaults '\r\n'
Dialect.strict
# When True, raise exception Error on bad CSV input. The default is False.

Examples

1
2
3
4
5
6
import csv
with open('some.csv', newline='', encoding='utf-8') as f:
reader = csv.reader(f)
for row in reader:
print(row)
# 偶尔是 encoding='utf-8-sig'
1
2
3
import csv
for row in csv.reader(['one,two,three']): # 解析字符串
print(row)

一、linux环境

1
2
3
4
5
执行命令,如何在任何目录下都可以执行这个命令
# 查找“指定命令”的完整路径,格式:find / -name 命令名
find / -name mysqladmin
# 把路径直接链接到/usr/bin下,格式:ln -s 指定命令的路径 /usr/bin
ln -s /usr/local/mysql/bin/mysqladmin /usr/bin

二、python虚拟环境

1
2
3
4
5
6
7
8
9
创建空的虚拟环境,pip指定位pip3,python指定位python3
# 安装python3的虚拟环境包,格式:pip3 install virtualenv
例子:pip3 install virtualenv
# 执行命令,加上--no-site-packages,格式:virtualenv --no-site-packages 虚拟环境名
例子:virtualenv --no-site-packages test
# 进入命令,格式:source 虚拟环境名/bin/activate
例子:source test/bin/activate
# 退出命令,格式:deactivate
例子:deactivate
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 1.安装python3
yum install python36
# 2.安装virtualenv和virtualenvwrapper
pip3 install virtualenv
pip3 install virtualenvwrapper
# 3.配置信息
vim ~/.bashrc
# 在末尾加上如下信息:
---------------------------
# virtualenvwrapper配置
export WORKON_HOME=/home/dev/virtualenv # 指定虚拟环境存放的目录
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3 #指定python解释器
source /usr/local/bin/virtualenvwrapper.sh # 执行脚本
---------------------------
source ~/.bashrc
# 4.常见命令
mkvirtualenv -p python3 虚拟环境名称 # 创建一个python3的虚拟环境
deactivate # 退出当前虚拟环境
workon [虚拟环境名称] # 使用某个虚拟环境
rmvirtualenv [虚拟环境名称] # 删除某个虚拟环境
lsvirtualenv # 列出所有虚拟环境
# 5.包管理
# 导出
pip freeze -l > packages.txt # 其中-l参数是只列出当前虚拟环境的包(字母l)
# 导入
pip install -r packages.txt
1
2
3
4
5
6
7
8
# window环境
# 1.安装virtualenv和virtualenvwrapper
pip install virtualenv
pip install virtualenvwrapper-win
# 2.指定虚拟环境存放的目录(配置系统环境变量)
变量名:WORKON_HOME
变量值:指定路径即可,eg:D:\virtualenv
# 3.其他等同于linux环境

os

1
2
3
import os
os.getpid()
os.getppid()

multiprocessing

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 部署分布式(master)
import queue
task_queue = queue.Queue() # 队列,后面会通过BaseManager封装,注册到网络上
from multiprocessing.managers import BaseManager
class QueueManager(BaseManager):
pass
QueueManager.register('get_task_queue', callable=lambda: task_queue) # 必须注册
manager = QueueManager(address=('', 5000), authkey=b'abc')
task = manager.get_task_queue() # 获取队列queue
manager.start() # 开启
manager.shutdown() # 关闭
# slave
class QueueManager(BaseManager):
pass
QueueManager.register('get_task_queue') # 一定要注册
m = QueueManager(address=(master_ip, 5000), authkey=b'abc')
m.connect()
task = m.get_task_queue()

socket

  • TCP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# TCP客户端
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('www.baidu.com',80))
s.send(bytes) # 发送
s.recv(1024) # 接收bytes,没有数据了,则为空
s.close()
# TCP服务端
s.bind(('127.0.0.1', 80)) # 对外服务绑定0.0.0.0
s.listen(5) # 等待连接的最大数量
while True:
# 接受一个新连接:
sock, addr = s.accept() # sock是socket对象,addr是客户端ip地址
# 创建新线程来处理TCP连接:
t = threading.Thread(target=tcplink, args=(sock, addr))
t.start()
def tcplink(sock, addr):
...
sock.close()