Python
- Openpyxl 操作续
- 解决PIP安装时开启代理的错误
- Sqlalchemy Docs
- Python Faker基础
- Python 技巧
- Atexit
- Openpyxl 操作
- Xlwings 操作
- Python Decorator
- Jupyter Notebook
- Arrow_api
Openpyxl 操作续
Openpyxl 操作
第一步 创建工作簿改名并保存
1import openpyxl
2
3wb = openpyxl.Workbook()
4ws = wb.active
5ws.title = 'SheetName'
6wb.save("./filename.xlsx")
7
8wb.close()
第二步 新建工作簿一个最前一个最后
1import openpyxl
2
3wb = openpyxl.Workbook()
4ws = wb.active
5ws.title = 'SheetName'
6
7ws = wb.creat_sheet("sheet1", 0)
8ws = wb.create_sheet("sheet2")
9
10wb.save("./filename.xlsx")
11
12wb.close()
第三步 写入单元格
1import openpyxl
2# step 1
3wb = openpyxl.Workbook()
4ws = wb.active
5ws.title = 'SheetName'
6
7# step 2
8ws = wb.creat_sheet("sheet1", 0)
9ws = wb.create_sheet("sheet2")
10
11# step 3
12ws['A1'] = 'Interfaces'
13ws['B1'] = 'Description'
14ws.cell(row=2, column=1, value='Gi1/0/1')
15ws.cell(row=3, column=1, value='Gi1/0/2')
16ws.cell(row=2, column=2, value='PC1')
17ws.cell(row=3, column=2, value='PC2')
18
19wb.save("./filename.xlsx")
20
21wb.close()
第四步 查看指定单元格/行/列的内容
1import openpyxl
2# step 1
3wb = openpyxl.Workbook()
4ws = wb.active
5ws.title = 'SheetName'
6
7# step 2
8ws = wb.creat_sheet("sheet1", 0)
9ws = wb.create_sheet("sheet2")
10
11# step 3
12ws['A1'] = 'Interfaces'
13ws['B1'] = 'Description'
14ws.cell(row=2, column=1, value='Gi1/0/1')
15ws.cell(row=3, column=1, value='Gi1/0/2')
16ws.cell(row=2, column=2, value='PC1')
17ws.cell(row=3, column=2, value='PC2')
18
19# step 4
20a3 = ws1['A3']
21print (a3.value)
22
23column_A = ws1['A']
24for i in column_A:
25 print (i.value)
26
27row_3 = ws1[3]
28for i in row_3:
29 print (i.value)
30
31for row in ws1.iter_rows(min_row=1, max_col=2, max_row=3):
32 for cell in row:
33 print (cell.value)
34
35for row in ws1.values:
36 for value in row:
37 print (value)
38
39b3 = ws1['B3']
40b3.value = 'PC3'
41print (b3.value)
42
43wb.save("./filename.xlsx")
44
45wb.close()
第五步 设置工作簿单元格属性
1import openpyxl
2from openpyxl.styles import PatternFill, Border, Side
3
4# step 1
5wb = openpyxl.Workbook()
6ws = wb.active
7ws.title = 'SheetName'
8
9# step 2
10ws = wb.creat_sheet("sheet1", 0)
11ws = wb.create_sheet("sheet2")
12
13# step 3
14ws['A1'] = 'Interfaces'
15ws['B1'] = 'Description'
16ws.cell(row=2, column=1, value='Gi1/0/1')
17ws.cell(row=3, column=1, value='Gi1/0/2')
18ws.cell(row=2, column=2, value='PC1')
19ws.cell(row=3, column=2, value='PC2')
20
21# step 4
22a3 = ws1['A3']
23print (a3.value)
24
25column_A = ws1['A']
26for i in column_A:
27 print (i.value)
28
29row_3 = ws1[3]
30for i in row_3:
31 print (i.value)
32
33for row in ws1.iter_rows(min_row=1, max_col=2, max_row=3):
34 for cell in row:
35 print (cell.value)
36
37for row in ws1.values:
38 for value in row:
39 print (value)
40
41b3 = ws1['B3']
42b3.value = 'PC3'
43print (b3.value)
44
45# step 5
46yellowFill = PatternFill(start_color='FFFF00', end_color='FFFF00', fill_type='solid')
47thin_border = Border(left=Side(style='thin'), right=Side(style='thin'), top=Side(style='thin'), bottom=Side(style='thin'))
48
49ws1['A1'].fill=yellowFill
50ws1['B1'].fill=yellowFill
51
52dims = {}
53for row in ws1.rows:
54 for cell in row:
55 cell.border=thin_border
56 if cell.value:
57 dims[cell.column_letter] = max((dims.get(cell.column, 0), len(str(cell.value))))
58
59for col, value in dims.items():
60 ws1.column_dimensions[col].width = value + 1
61
62
63wb.save("./filename.xlsx")
64
65wb.close()
解决PIP安装时开启代理的错误
解决PIP安装时开启代理的错误
开启本地代理安装PIP时, 有可能会有如下错误
1$ pip install wmi
2Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
3WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None))
4 after connection broken by 'ProxyError('Cannot connect to proxy.', FileNotFoundError(2, 'No such file or directory'))': /simple/wmi/
解决方法
- 在系统目录C:\Users\用户\AppData\Roaming新建pip文件夹
- 在pip文件夹下新建pip.ini文件,并写入如下配置
1[global]
2index-url = http://mirrors.aliyun.com/pypi/simple/
3[install]
4trusted-host = mirrors.aliyun.com
Sqlalchemy Docs
SQLAlchemy 是python中,通过ORM操作数据库的框架。简单点来说,就是帮助我们从烦冗的sql语句中解脱出来,从而不需要再去写原生的sql语句,只需要用python的语法来操作对象,就能被自动映射为sql语句。
Sqlalchemy 简单使用
安装配置
pip install sqlalchemy
初步使用
1# 导入:
2from sqlalchemy import Column, String, create_engine
3from sqlalchemy.orm import sessionmaker
4from sqlalchemy.ext.declarative import declarative_base
5
6# 创建对象的基类:
7Base = declarative_base()
8
9# 定义User对象:
10class User(Base):
11 # 表的名字:
12 __tablename__ = 'user'
13
14 # 表的结构:
15 id = Column(Integer, primary_key=True, autoincrement=True)
16 name = Column(String(20))
17
18# 初始化数据库连接:
19engine = create_engine('mysql+pymysql://root:root@localhost/tmpdb?charset=utf8')
20# 创建DBSession类型:
21DBSession = sessionmaker(bind=engine)
22# 创建session对象:
23session = DBSession()
24# 创建新User对象:
25new_user = User(id='5', name='Bob')
26# 添加到session:
27session.add(new_user)
28# 提交即保存到数据库:
29session.commit()
30# 关闭session:
31session.close()
初始化数据库连接
1engine = create_engine('dialect+driver://username:password@host:port/database')
2# dialect:数据库类型
3# driver:数据库驱动选择
4# username:数据库用户名
5# password: 用户密码
6# host:服务器地址
7# port:端口
8# database:数据库
1# PostgreSQL
2engine = create_engine('postgresql://username:password@localhost/database')
3engine = create_engine('postgresql+psycopg2://username:password@localhost/database')
4engine = create_engine('postgresql+pg8000://username:password@localhost/database')
5
6# Mysql
7engine = create_engine('mysql://username:password@localhost/database')
8engine = create_engine('mysql+mysqldb://username:password@localhost/database')
9engine = create_engine('mysql+mysqlconnector://username:password@localhost/database')
10engine = create_engine('mysql+oursql://username:password@localhost/database')
11engine = create_engine('mysql+pymysql://username:password@localhost/database')
12
13# Oracle
14engine = create_engine('oracle://username:password@127.0.0.1:1521/database')
15engine = create_engine('oracle+cx_oracle://username:password@tnsname')
16
17# Microsoft SQL Server
18engine = create_engine('mssql+pyodbc://username:password@mydsn')
19engine = create_engine('mssql+pymssql://username:password@hostname:port/database')
20
21# SQLite
22engine = create_engine('sqlite:///database.db')
23engine = create_engine('sqlite:absolute/path/to/database.db')
# create_engine 其它可选参数
# echo :为 True 时候会把sql语句打印出来
# pool_size: 是连接池的大小,默认为5个,0表示连接数无限制
# pool_recycle: MySQL 默认情况下如果一个连接8小时内容没有任何动作(查询请求)就会自动断开链接,出现 MySQL has gone away的错误。设置了 pool_recycle 后 SQLAlchemy 就会在指定时间内回收连接。如果设置为3600 就表示 1小时后该连接会被自动回收。
# pool_pre_ping : 这是1.2新增的参数,如果值为True,那么每次从连接池中拿连接的时候,都会向数据库发送一个类似 select 1 的测试查询语句来判断服务器是否正常运行。当该连接出现 disconnect 的情况时,该连接连同pool中的其它连接都会被回收。
MetaData Table
1# 获取元数据
2metadata = MetaData()
3# 定义表
4user = Table('user', metadata,
5 Column('id', Integer, primary_key=True),
6 Column('name', String(20)),
7 )
8
9color = Table('color', metadata,
10 Column('id', Integer, primary_key=True),
11 Column('name', String(20)),
12 )
13
14# 执行sql语句
15engine.execute(
16 "INSERT INTO db_name.color(id, name) VALUES ('1', 'liuyao');"
17)
18result = engine.execute('select * from color')
19print(result.fetchall())
数据模型
1from sqlalchemy.ext.declarative import declarative_base
2from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, UniqueConstraint, Index
3
4Base = declarative_base()
5
6
7class User(Base):
8 __tablename__ = 'user'
9 id = Column(Integer, primary_key=True, autoincrement=True)
10 name = Column(String(80))
11
12 def __repr__(self):
13 return '<User: {}>'.format(self.name)
14
15
16class Address(Base):
17 __tablename__ = 'address'
18 id = Column(Integer, primary_key=True, autoincrement=True)
19 email = Column(String(80))
20 user_id = Column(Integer, ForeignKey('user.id'))
21
22 def __repr__(self):
23 return "<Address %s %d>" % (self.email, self.user_id)
24
25
26# 清除已有表
27Base.metadata.drop_all(engine)
28# 建立表
29Base.metadata.create_all(engine)
30
31
数据查询
1# 前置数据模型代码
2class User(Base):
3 __tablename__ = 'user'
4 id = Column(Integer, primary_key=True, autoincrement=True)
5 name = Column(String(40), unique=True, nullable=False)
6 email = Column(String(80), nullable=True)
7
8 def __repr__(self):
9 return "<User: %s, %s, %s>" % (self.id, self.name, self.email)
10
11 def to_dict(self):
12 return {c.name: getattr(self, c.name, None) for c in self.__table__.columns}
13
14
15class Course(Base):
16 __tablename__ = 'course'
17 id = Column(Integer, primary_key=True, autoincrement=True)
18 name = Column(String(80))
19 # ForeignKey 设置外键关联,第一个参数为字符串,user 为数据表名,id 为字段名
20 # 第二个参数 ondelete 设置删除 User 实例后对关联的 Course 实例的处理规则
21 # 'CASCADE' 表示级联删除,删除用户实例后,对应的课程实例也会被连带删除
22 user_id = Column(Integer, ForeignKey('user.id', ondelete='CASCADE'))
23 # relationship 设置查询接口,以便后期进行数据库查询操作
24 # 第一个参数为位置参数,参数值为外键关联的映射类名,数据类型为字符串
25 # 第二个参数 backref 设置反向查询接口
26 # backref 的第一个参数 'course' 为查询属性,User 实例使用该属性可以获得相关课程实例的列表
27 # backref 的第二个参数 cascade 如此设置即可实现 Python 语句删除用户数据时级联删除课程数据
28 user = relationship('User',
29 backref=backref('course', cascade='all, delete-orphan'))
30
31 def __repr__(self):
32 return '<Course: %s, %s, %s>' % (self.id, self.name, self.user_id)
33
34 def to_dict(self):
35 return {c.name: getattr(self, c.name, None) for c in self.__table__.columns}
36
37
38class Address(Base):
39 __tablename__ = "address"
40 id = Column(Integer, primary_key=True, autoincrement=True, comment='主键')
41 user_id = Column(Integer, nullable=False, comment='用户ID')
42 addr = Column(String(200), nullable=True)
43
44 def __repr__(self):
45 return '<Address %s, %s>' % (self.user_id, self.addr)
46
47 def to_dict(self):
48 return {c.name: getattr(self, c.name, None) for c in self.__table__.columns}
1userquery = session.query(User)
2lst = [
3 # 条件查询
4 userquery.filter(User.id > 3).all(),
5 userquery.filter(User.id > 4).all()[:3],
6 session.query(User.name).filter(User.id > 4).all(),
7 userquery.filter(User.id == 3).first(),
8 userquery.filter(User.id == 5).one(),
9 userquery.filter(User.id.between(3,6)).all(),
10 # 限制返回条数
11 userquery.filter(User.id > 0).all(),
12 userquery.filter(User.id > 0).limit(2).all(),
13 userquery.filter(User.id > 0).offset(2).all(),
14 userquery.filter(User.id > 0).slice(2, 3).all(),
15 # 条件排序
16 userquery.filter(User.id > 0).order_by(User.id).all(),
17 userquery.filter(User.id > 0).order_by(desc(User.id)).all(),
18 userquery.filter(User.id > 0).order_by(User.id.asc()).all(),
19 userquery.filter(User.id > 0).order_by(User.id.desc()).all(),
20 # 不等于
21 userquery.filter(User.id != 3).all(),
22 # 模糊匹配 like, not like
23 userquery.filter(User.email.like('%ao%')).all(),
24 userquery.filter(User.email.notlike('%ao%')).all(),
25 # 匹配
26 userquery.filter(User.email.startswith("a")).all(),
27 userquery.filter(User.email.endswith("g")).all(),
28 userquery.filter(User.email.contains("ao")).all(),
29 # 属于in_ 不属于 notin_
30 userquery.filter(User.id.in_([1, 3, 5])).all(),
31 userquery.filter(User.id.notin_((1, 3, 5))).all(),
32 # 空判断
33 userquery.filter(User.name == None).all(),
34 userquery.filter(User.name.is_(None)).all(),
35 userquery.filter(User.name.isnot(None)).all(),
36 # 多条件
37 userquery.filter(User.id > 3, User.id < 5).all(),
38 userquery.filter(User.id > 3).filter(User.id < 5).all(),
39 # 选择条件
40 userquery.filter(or_(User.id < 2, User.id > 9)).all(),
41 userquery.filter(and_(User.id > 3, User.id < 6)).all(),
42 # 去重
43 userquery.filter(User.id > 3).distinct().all(),
44 # 聚合函数
45 session.query(Course.user_id, func.count(Course.user_id).label('number')).group_by(Course.user_id).all(),
46 session.query(Course.user_id, func.count(Course.user_id).label('number')).group_by(Course.user_id).having(func.count(Course.user_id) > 1).all(),
47 session.query(Course.user_id, func.sum(Course.user_id).label('number')).group_by(Course.user_id).all(),
48 session.query(Course.user_id, func.max(Course.user_id).label('number')).group_by(Course.user_id).all(),
49 session.query(Course.user_id, func.min(Course.user_id).label('number')).group_by(Course.user_id).all(),
50 # 使用extract提取时间中的分钟或者天来分组
51 session.query(extract('minute', User.creatime).label('minute'), func.count('*').label('count')).group_by('minute').all(),
52 session.query(extract('day', User.creatime).label('day'), func.count('*').label('count')).group_by('day').all(),
53 # Join
54 有外键
55 session.query(User.id, User.name.label('uname'), Course.name.label("cname")).join(Course).filter(User.id > 4).all(),
56 无外键, 指定关联关系
57 session.query(User.id, User.name, Address.addr).join(Address, User.id == Address.user_id).filter(User.id > 5).all(),
58 # text 直接写sql
59 userquery.filter(text("id>:id")).params(id=4).all(),
60
61]
62
63# 外连接
64smtp = session.query(User).filter(User.id > 5).subquery()
65lst.append(session.query(smtp.c.name, Address.addr).outerjoin(smtp, Address.user_id == smtp.c.id).all())
66
67
68for res in lst:
69 print(res)
70 # 单对象
71 # data = [r.to_dict() for r in res]
72 # print(data)
73 # 多表查询时
74 # data = [dict(zip(result.keys(), result)) for result in res]
75 # print(data)
76 print("*" * 30)
模型关系
使用代码维护表间外键关联
1class Blog(Base):
2 __tablename__ = 'blog'
3
4 id = Column(BIGINT, primary_key=True, autoincrement=True)
5 title = Column(String(64), server_default='', nullable=False)
6 text = Column(Text, nullable=False)
7 user = Column(BIGINT, nullable=False) # Column(BIGINT, ForeignKey('user.id'), index=True, nullable=False)
8 create = Column(BIGINT, index=True, server_default='0', nullable=False)
9
10 def __repr__(self):
11 return '<Course: %s, %s, %s>' % (self.id, self.title, self.user)
12
13class User(Base):
14 __tablename__ = 'user'
15
16 id = Column(BIGINT, primary_key=True, autoincrement=True)
17 name = Column(String(32), server_default='', nullable=False)
18 username = Column(String(32), index=True, server_default='', nullable=True)
19 password = Column(String(64), server_default='', nullable=False)
20
21 def __repr__(self):
22 return '<Course: %s, %s, %s>' % (self.id, self.name, self.username)
23
24
25# 查询
26print( session.query(User).all() )
27pirnt( session.query(Blog).all() )
28print( session.query(Blog).join(User, user.id==Blog.user).all() )
使用数据库维护表间外键关联
1class Blog(Base):
2 __tablename__ = 'blog'
3
4 id = Column(BIGINT, primary_key=True, autoincrement=True)
5 title = Column(String(64), server_default='', nullable=False)
6 text = Column(Text, nullable=False)
7 user = Column(BIGINT, ForeignKey('user.id'), index=True, nullable=False)
8 create = Column(BIGINT, index=True, server_default='0', nullable=False)
9
10 def __repr__(self):
11 return '<Course: %s, %s, %s>' % (self.id, self.title, self.user)
12
13class User(Base):
14 __tablename__ = 'user'
15
16 id = Column(BIGINT, primary_key=True, autoincrement=True)
17 name = Column(String(32), server_default='', nullable=False)
18 username = Column(String(32), index=True, server_default='', nullable=True)
19 password = Column(String(64), server_default='', nullable=False)
20
21 def __repr__(self):
22 return '<Course: %s, %s, %s>' % (self.id, self.name, self.username)
23
24
25# 查询
26print( session.query(User).all() )
27pirnt( session.query(Blog).all() )
28print( session.query(Blog).join(User).filter(User.id==3).all() )
backref & back_populates
1# backref 只要一边写上就可以
2class User(Base):
3 __tablename__ = 'user'
4 id = Column(Integer, primary_key=True, autoincrement=True)
5 name = Column(String(80))
6
7 addresses = relationship("Address", backref="user")
8
9 def __repr__(self):
10 return '<User: {}>'.format(self.name)
11
12
13class Address(Base):
14 __tablename__ = 'address'
15 id = Column(Integer, primary_key=True, autoincrement=True)
16 email = Column(String(80))
17 user_id = Column(Integer, ForeignKey('user.id'))
18
19 def __repr__(self):
20 return "<Address %s %d>" % (self.email, self.user_id)
21
22# back_populates 要两边都写上
23class User(Base):
24 __tablename__ = 'user'
25 id = Column(Integer, primary_key=True, autoincrement=True)
26 name = Column(String(80))
27
28 addresses = relationship("Address", back_populates="user")
29
30 def __repr__(self):
31 return '<User: {}>'.format(self.name)
32
33
34class Address(Base):
35 __tablename__ = 'address'
36 id = Column(Integer, primary_key=True, autoincrement=True)
37 email = Column(String(80))
38 user_id = Column(Integer, ForeignKey('user.id'))
39
40 user = relationship("User", back_populates="addresses")
41
42 def __repr__(self):
43 return "<Address %s %d>" % (self.email, self.user_id)
44
45# 查询
46
47user = session.query(User).get(3)
48print(user, user.address)
49addr = session.qeury(Address).get(3)
50print(addr, addr.user)
一对多关联
1class Parent(Base): # 一
2 __tablename__ = 'parent'
3 id = Column(Integer, primary_key=True)
4 name = Column(String(64), nullable=False)
5 children = relationship("Child", backref=backref('parents'))
6
7
8class Child(Base): # 多
9 __tablename__ = 'child'
10 id = Column(Integer, primary_key=True)
11 name = Column(String(64), nullable=False)
12 parent_id = Column(Integer, ForeignKey('parent.id'))
13
14# 一对多 一方
15# children = relationship("Child", backref=backref('parents'), cascade="all, delete-orphan")
16# 一对多 多方
17# parents = relationship("Parent", backref=backref('children', cascade="all, delete-orphan"))
18# 以上可以级联删除
一对一关联
1
多对多关联
1
Python Faker基础
Faker库基础应用
安装使用
pip install Faker
from faker import Faker # 1
fake = Faker() # 2
fake.name() # 3
# Donna Kelly
fake.address() # 4
# 519 Donna River
使用中文数据
from faker import Faker
fake = Faker(locale='zh_CN')
fake.name()
# 庞超
fake.address()
# 河北省辛集县合川张街p座 489476
其他API
地址相关
fake.address() # 地址
# '香港特别行政区大冶县上街钟街k座 664713'
fake.building_number() # 楼名
# 'v座'
fake.city() # 完整城市名
# '长春县'
fake.city_name() # 城市名字(不带市县)
# '梧州'
fake.city_suffix() # 城市后缀名
# '市'
fake.country() # 国家名称
# '厄立特里亚'
fake.country_code(representation="alpha-2")
# 'BZ' # 国家编号
fake.district() # 地区
# '沙湾'
fake.postcode() # 邮编
# '332991'
fake.province() # 省
# '河北省'
fake.street_address() # 街道地址
# '武汉街D座'
fake.street_name() # 街道名称
# '广州路'
fake.street_suffix() # 街道后缀名
# '路'
汽车相关
fake.license_plate() # 牌照
# 'ZCO 000'
银行相关
fake.bank_country() # 银行所属国家
# 'GB'
fake.bban() # 基本银行账号
# 'TPET9323218579379'
fake.iban() # 国际银行代码
# 'GB82IRVM1531009974701'
条形码相关
fake.ean(length=13) # EAN条形码
# '5456457843465'
fake.ean13() # EAN13条形码
# '2689789887590'
fake.ean8() # EAN8条形码
# '52227936'
颜色相关
fake.color_name() # 颜色名称
# 'Orange'
fake.hex_color() # 颜色十六进制值
# '#a5cb7c'
fake.rgb_color() # 颜色RGB值
# '15,245,42'
fake.rgb_css_color() # CSS颜色值
# 'rgb(15,70,13)'
fake.safe_color_name() # 安全色
# 'aqua'
fake.safe_hex_color() # 安全色十六进制值
# '#881100'
公司相关
fake.bs() # 商业用词
# 'synthesize strategic vortals'
fake.catch_phrase() # 妙句(口号)
# 'Robust even-keeled service-desk'
fake.company() # 公司名称
# '富罳科技有限公司'
fake.company_prefix() # 公司名称前缀
# '商软冠联'
fake.company_suffix() # 公司名称后缀
# '网络有限公司'
信用卡相关
fake.credit_card_expire(start="now", end="+10y", date_format="%m/%y") # 过期年月
# '11/20'
fake.credit_card_full(card_type=None) # 完整信用卡信息
# 'VISA 16 digit\n秀珍 卢\n4653084445257690 11/19\nCVC: 935\n'
fake.credit_card_number(card_type=None) # 信用卡卡号
# '4339481813664365360'
fake.credit_card_provider(card_type=None) # 信用卡提供商
# 'VISA 19 digit'
fake.credit_card_security_code(card_type=None) # 信用卡安全码
# '597'
货币相关
fake.cryptocurrency() # 加密货币代码+名称
# ('TRX', 'TRON')
fake.cryptocurrency_code() # 加密货币代码
# 'MZC'
fake.cryptocurrency_name() # 加密货币名称
# 'Ripple'
fake.currency() # 货币代码+名称
# ('GNF', 'Guinean franc')
fake.currency_code() # 货币代码
# 'SOS'
fake.currency_name() # 货币名称
# 'Lebanese pound'
时间相关
fake.am_pm() # AM或PM
# 'PM'
fake.century() # 世纪
# 'XII'
fake.date(pattern="%Y-%m-%d", end_datetime=None) # 日期字符串(可设置格式和最大日期)
# '1998-05-13'
fake.date_between(start_date="-30y", end_date="today") # 日期(可设置限定范围)
# datetime.date(2014, 8, 17)
fake.date_between_dates(date_start=None, date_end=None) # 同上
# datetime.date(2019, 10, 14)
fake.date_object(end_datetime=None) # 日期(可设置最大日期)
# datetime.date(1981, 12, 20)
fake.date_of_birth(tzinfo=None, minimum_age=0, maximum_age=115) # 出生日期
# datetime.date(1931, 12, 8)
fake.date_this_century(before_today=True, after_today=False) # 本世纪日期
# datetime.date(2003, 5, 4)
fake.date_this_decade(before_today=True, after_today=False) # 本年代中的日期
# datetime.date(2014, 1, 29)
fake.date_this_month(before_today=True, after_today=False) # 本月中的日期
# datetime.date(2019, 10, 10)
fake.date_this_year(before_today=True, after_today=False) # 本年中的日期
# datetime.date(2019, 3, 6)
fake.date_time(tzinfo=None, end_datetime=None) # 日期和时间
# datetime.datetime(1990, 8, 11, 22, 25)
fake.date_time_ad(tzinfo=None, end_datetime=None, start_datetime=None) # 日期和时间(从001年1月1日到现在)
# datetime.datetime(244, 12, 17, 9, 59, 56)
fake.date_time_between(start_date="-30y", end_date="now", tzinfo=None) # 日期时间(可设置限定范围)
# datetime.datetime(1995, 4, 19, 17, 23, 51)
fake.date_time_between_dates(datetime_start=None, datetime_end=None, tzinfo=None) # 同上
# datetime.datetime(2019, 10, 14, 14, 15, 36)
fake.date_time_this_century(before_now=True, after_now=False, tzinfo=None) # 本世纪中的日期和时间
# datetime.datetime(2009, 8, 26, 18, 27, 9)
fake.date_time_this_decade(before_now=True, after_now=False, tzinfo=None) # 本年代中的日期和时间
# datetime.datetime(2019, 2, 24, 22, 18, 44)
fake.date_time_this_month(before_now=True, after_now=False, tzinfo=None) # 本月中的日期和时间
# datetime.datetime(2019, 10, 3, 9, 20, 44)
fake.date_time_this_year(before_now=True, after_now=False, tzinfo=None) # 本年中的日期和时间
# datetime.datetime(2019, 2, 10, 7, 3, 18)
fake.day_of_month() # 几号
# '23'
fake.day_of_week() # 星期几
# 'Tuesday'
fake.future_date(end_date="+30d", tzinfo=None) # 未来日期
# datetime.date(2019, 10, 28)
fake.future_datetime(end_date="+30d", tzinfo=None) # 未来日期和时间
# datetime.datetime(2019, 10, 28, 21, 4, 35)
fake.iso8601(tzinfo=None, end_datetime=None) # iso8601格式日期和时间
# '1995-04-10T00:45:01'
fake.month() # 第几月
# '07'
fake.month_name() # 月份名称
# 'December'
fake.past_date(start_date="-30d", tzinfo=None) # 过去日期
# datetime.date(2019, 10, 3)
fake.past_datetime(start_date="-30d", tzinfo=None) # 过去日期和时间
# datetime.datetime(2019, 9, 30, 20, 25, 43)
fake.time(pattern="%H:%M:%S", end_datetime=None) # 时间(可设置格式和最大日期时间)
# '14:26:44'
fake.time_delta(end_datetime=None) # 时间间隔
# datetime.timedelta(0)
fake.time_object(end_datetime=None) # 时间(可设置最大日期时间)
# datetime.time(4, 41, 39)
fake.time_series(start_date="-30d", end_date="now", precision=None, distrib=None, tzinfo=None)
# <generator object Provider.time_series at 0x7fadf51e0930>
fake.timezone() # 时区
# 'Asia/Baku'
fake.unix_time(end_datetime=None, start_datetime=None) # UNIX时间戳
# 393980728
fake.year() # 某年
# '2016'
文件相关
fake.file_extension(category=None) # 文件扩展名
# 'avi'
fake.file_name(category=None, extension=None) # 文件名
# '专业.pptx'
fake.file_path(depth=1, category=None, extension=None) # 文件路径
# '/的话/以上.ods'
fake.mime_type(category=None) # MIME类型
# 'application/xop+xml'
fake.unix_device(prefix=None) # UNIX设备
# '/dev/xvdq'
fake.unix_partition(prefix=None) # UNIX分区
# '/dev/xvdc6'
坐标相关
fake.coordinate(center=None, radius=0.001) # 坐标
# Decimal('147.543284')
fake.latitude() # 纬度
# Decimal('66.519139')
fake.latlng() # 经纬度
# (Decimal('55.3370965'), Decimal('-15.427896'))
fake.local_latlng(country_code="US", coords_only=False) # 返回某个国家某地的经纬度
# ('25.67927', '-80.31727', 'Kendall', 'US', 'America/New_York')
fake.location_on_land(coords_only=False) # 返回地球上某个位置的经纬度
# ('42.50729', '1.53414', 'les Escaldes', 'AD', 'Europe/Andorra')
fake.longitude() # 经度
# Decimal('70.815233')
网络相关
fake.ascii_company_email(*args, **kwargs) # 企业邮箱(ascii编码)
# 'qiuyan@xiulan.cn'
fake.ascii_email(*args, **kwargs) # 企业邮箱+免费邮箱(ascii编码)
# 'lei59@78.net'
fake.ascii_free_email(*args, **kwargs) # 免费邮箱(ascii编码)
# 'pcheng@gmail.com'
fake.ascii_safe_email(*args, **kwargs) # 安全邮箱(ascii编码)
# 'fangyan@example.org'
fake.company_email(*args, **kwargs) # 企业邮箱
# 'scao@pingjing.net'
fake.domain_name(levels=1) # 域名
# 'dy.cn'
fake.domain_word(*args, **kwargs) # 二级域名
# 'gangxiuying'
fake.email(*args, **kwargs) # 企业邮箱+免费邮箱
# 'na13@ding.cn'
fake.free_email(*args, **kwargs) # 免费邮箱
# 'fang48@hotmail.com'
fake.free_email_domain(*args, **kwargs) # 免费邮箱域名
# 'yahoo.com'
fake.hostname(*args, **kwargs) # 主机名
# 'lt-70.53.cn'
fake.image_url(width=None, height=None) # 图片URL
# 'https://placekitten.com/752/243'
fake.ipv4(network=False, address_class=None, private=None) # ipv4
# '160.152.149.78'
fake.ipv4_network_class() # ipv4网络等级
# 'b'
fake.ipv4_private(network=False, address_class=None) # 私有ipv4
# '10.99.124.57'
fake.ipv4_public(network=False, address_class=None) # 公共ipv4
# '169.120.29.235'
fake.ipv6(network=False) # ipv6
# 'f392:573f:d60f:9aed:2a4c:36d7:fe5b:7034'
fake.mac_address() # MAC地址
# '62:67:79:8c:c2:40'
fake.safe_email(*args, **kwargs) # 安全邮箱
# 'jing58@example.org'
fake.slug(*args, **kwargs) # URL中的slug
# ''
fake.tld() # 顶级域名
# 'cn'
fake.uri() # URI
# 'http://yi.com/list/main/explore/register.php'
fake.uri_extension() # URI扩展
# '.php'
fake.uri_page() # URI页
# 'terms'
fake.uri_path(deep=None) # URI路径
# 'blog/tags/blog'
fake.url(schemes=None) # URL
# 'http://liutao.cn/'
fake.user_name(*args, **kwargs) # 用户名
# 'xiulan80'
图书相关
fake.isbn10(separator="-") # ISBN-10图书编号
# '0-588-73943-X'
fake.isbn13(separator="-") # ISBN-13图书编号
# '978-1-116-51399-8'
职位相关
fake.job() # 职位
# '法务助理'
文本相关
fake.paragraph(nb_sentences=3, variable_nb_sentences=True, ext_word_list=None) # 单个段落
# '最新事情生产.方面解决名称责任而且.类型其实内容发生电脑.音乐具有今年是一.'
fake.paragraphs(nb=3, ext_word_list=None) # 多个段落
# ['使用评论管理.没有广告工作评论是否.', '帖子而且专业.这些比较完全发现准备设计工具.', '完成详细发生空间汽车.新闻电影您的游戏这种操作网站知道.']
fake.sentence(nb_words=6, variable_nb_words=True, ext_word_list=None) # 单个句子
# '直接这样点击单位对于时候.'
fake.sentences(nb=3, ext_word_list=None) # 多个句子
# ['电话国际项目管理.', '软件之后提高一样次数电影规定.', '东西会员发展什么不断经济.']
fake.text(max_nb_chars=200, ext_word_list=None) # 单个文本
# ('资源信息得到因此开发资源资料.\n'
# '国家这样等级需要用户如此.电话非常一切游戏所以学校类型.不要正在如果来源认为投资在线.\n'
# '这些更新密码其中起来实现有些.以上事情重要通过.\n'
# '但是就是介绍最大深圳简介设计.历史这种可以出现中心社区.\n'
# '政府当然包括简介全国内容生活.有些地址以上.回复这些来自搜索现在不断经营不断.\n'
# '操作为什孩子报告东西拥有如此.相关特别业务日本这种.合作问题准备比较谢谢.')
fake.texts(nb_texts=3, max_nb_chars=200, ext_word_list=None) # 多个文本
# [ '地址控制无法正在必须中心积分一些.支持制作安全.\n'
# '比较最新最大她的功能能够是一.主题选择当前显示.\n'
# '的话社会现在地区阅读继续所有.美国数据正在深圳不能.\n'
# '能够查看其中生活商品.谢谢认为之后以及以下之后这里.\n'
# '活动支持人民这么今年.要求包括生活运行技术社会.\n'
# '当前更多游戏.下载一点开发论坛法律为了美国.\n'
# '如何更新个人谢谢作为还有论坛.销售销售法律学生这么责任一些.',
# '日本最大方法活动主题到了结果.教育还有孩子觉得简介出现国际.东西国家图片威望品牌.\n'
# '那些会员现在准备可能.威望部分文件主题东西业务一切之间.所以必须当前方法.\n'
# '等级大小重要可能下载孩子.来源感觉业务文件以后深圳学校.网络什么新闻都是安全.\n'
# '资料重要成功谢谢时候音乐安全相关.电脑系列日期.工具使用搜索来源首页.\n'
# '直接企业影响大小什么.相关品牌选择她的规定来源推荐.',
# '中文文化数据内容系统.他们这些之间深圳.\n'
# '联系城市出现部分都是政府生活.社会同时人民市场现在决定需要.其他政府简介深圳教育加入对于.\n'
# '运行是一语言安全通过大小学生.商品然后信息由于虽然.\n'
# '因为关于选择希望行业具有深圳.出现价格那么下载提高知道人员.设备直接显示事情帖子正在两个关于.\n'
# '系列公司大家.论坛所以完全文章标准.活动中国工具电脑.\n'
# '主题作者不能.进行国家系统地区增加.经验质量价格我的.']
fake.word(ext_word_list=None) # 单个词语
# '新闻'
fake.words(nb=3, ext_word_list=None, unique=False) # 多个词语
# ['选择', '历史', '规定']
编码相关
fake.binary(length=1048576) # 二进制
# (b'\xbf\xce\x01Y:\xf7\xf4\xe0G]\x94*Rb\x9f\x85\xb6\xcd\x83\x15\t\xbc\x16\x8d'
# b'\xcb\n\x90\x10S\x1e85\x91\xae\x06\xbdq.\xf6c\x1f\xfd\x94=\\\xf9_\xc2'
# b't\xe0{\x15\xd9\x8fW7\xe5[\x0b\x84\xd2\x94\xf4\xd91\xd2\x91\x01\xb5\xeej\x84'
# b'*\x81\x96\xa7\xa9\xda\x1f\xee\x9a\xb0\x1d\xef\xad\x92\x1c\x0f\xa0U6\xaf'
# b'x5\x9f\x93\\b \xf7kq\xfe\x97(\xe0Q\x89*\xbb\x8b\x9a\x14\xd2\xfe\x07'
# b'\xfe\xcfYy\x16\x12\xef\xe3\xd9%\x95\\\x80O\xec\x9f\xf7\x88\xfal'
# b'\x11\x93\x94\xb1\xd9\xf6b\xf0\x7f\xa2\x95\x93[\x98\xf3\xe0$\xdd\xe0D'
# b'\xde\x8c\xe3\xe0\xc0f\xab\x1c\xf6\xdf]\xbe8U\x11\xc7\xce\xf6f\xc9'
# b'1\xa6\xda\x85\xe6.\xda\xd1_\x8a\xbe\x05\xbf\xf4*x [\xb9\xc3\xbb\x99\xa1\xbe'
# b'GT\xb75\x96\x8a\x9a:`o\x1bm\xe9KzT\x0c\xdc\xb1\xe7ssiN\xcb2\x8eY'
# b'\xd1\xb4\x8c+\xe9\xc1Ph\x0fD\x0f\xd5}\n/K$\x85J\xaf\x1d\xb2\xd0R\xa7n0l'
# b'\xafQ\x91\x95\xac]a\xe1\x8f\x1f\x9e`e\xd2\x1f\xaa\xeb\xf3[}(\xd60\x01'
# b'Y\r\xe2XCW\xba\xa3\xad\xe4OP\x891=\xff\xae\xb9\x9d\xa2!\xfa2\r\x81\xfat\xfb'
# b'3t%\xd5\x11B\x94Os\x8d\xc5\xae%\xa6\x93}[p\x02\xd7\xba\xa4\xf0?R\xbb\xf6\xb1'
# b'h\x12J\x05\xce\xf9\xcd\xc6\xa7\xed\x80\x9e\x9e\xf8q]\xab\x9a\xd7\xd6'
# b'\xad\xecK\x1d=\xb0?\xb2\x83\t<\xb2ZGl\x9f\x8dmI\x1d\xf1jh\xd3s\x9d\xd6\xf9'
# b'\x8e\xbfs\xa9_\xe0\xaf\x86O\xde|\x17\xb5\x8b\xe4:Z\xa1\x01f\xc9l[Z'
# b'\xb4\x7fS\x0f7\x9c\x9d\xdd\xd3PY\x86\xf4\xec\xcb\x87\x05\xafU-\xaebY~'
# b"\x9f\xec\xf6\x9c\x84\x99'S\xd4\t.\xd0x\xbb\x01<&\xdd\xfc6M\xa9|R"
# b'\xec\xf9b\xcdz\x9a\x97p\xb5\xb6\x13\xd9\xab\x91C\xe4\x95\xc9\x18\xaeAi\\N'
# b"#\x99\t+Z\xd2\xf1\x89\xa0L\x04\xef\xaf<\xc4\xfbO\xcd\x83\xd4\x17'C\x10"
# b'\x0b\xd6\xb5Cv\x98}E\xc9;\xbf\x05\xab\xc7 W\xa8\xbcmX\x06\x865\xbe\\f\xedc'
# b'\xacb\xc8\x84\xc0KI\xd5\xea\x888\x93^\xfcE\xee,^(\x97g\xd17\xcd8\xabU\x95'
# b'\x17~]\x08\x11\xa4\xbf\xed\xf3\xabm\x15l\xde\xf5\x06c\xe1\xad+'
# b'\xed\xd1\xa5\xda\x15\xbax\xac}\x8e\xd7\x8831\x04\xb3\xae\xc7\xb4\x04'
# b'y\xda!\xeb\x1e\xcd\n+\x94#4\xe51\xc8\xe9t\n.:\xfd\xcfc\x1a\xcf\x99VY\x11'
# b'Y\x1bF\xe9\x9e\xebK\x86WD\x80\x12\xf1\x11z\xf6\xe3vV4\xbcB\n^k(\x1aw'
# b'<\xfd\x95z\t\xf7\xaa_F%n\xc4\xeb\x94\xcd\x80\xffh\xbe{^\x04\xe3\xe7'
# b'\xab\xa3\xd9\x037\x86\xde~J\x15th\x98_\xda\xe25\xeaO\xc8\x15\xae\xd7\xa9'
# b'\x80\x9as\xef<FU\xb2\x10\x7fN\x05\x8dd_\xef\x0bQO-\x9diW\xdc\xcdV\xbe*'
# b'\x13\xa7$\x08\xe4\xb8\x96bd\xcf\xe7\xd6h\xe9.{Z:S\xef\xc4\x14R\x91'
# b"\xce\xd3\xcd\xe3\xbc\x9f!Y\x05A\xa00\x11\xca\xaa\xeb\xc4')\xb3\xdcF\x8e\xfa"
# b'\xbd\x9b:\xae\x1f\xbe<7]\x93E\xc2\x1b\x17\xc95x\x8f\x88|\xb8^\xea\x06'
# b'(\x9d\xc5\xeb\x8a|\x9f\x05\x83\xfe\xf5KsUy\xdc\xd1S\x96\xda\xc5q\xc4\xfd'
# b'\xeb\xc4"\x14Y\x1cU\x99\xe8\x11r\x04\x941\xa1\xac^c\xbbG\xc4\xd8\xb70'
# b'\xadX\x98\xad\xf8\xc1\x11\x10\xbc\x00\x80\x84\x05\x07b\x8c0\x93\xe6\xd8'
# b'\xe2I\xea\xecm+-\x8aY\xb8F\x0e\x19#zH{/\xcb\x88\xac\xa9\xfe\x84cH[_'
# b'0d\xc6\xc4\x0b\r\x9ef\n\xb3\x97d\xb4;\xf1\x014kv\xd9h\xad\x18/\xe6\xf1r\xa1'
# b'3\x9cz\xf7\x90\r\xaf\xed\x85\x07\x80\xbb\xc2\x82\xe4\xcc\x91\xc8\xdf\x9a'
# b'`St\xd8\x98\xbb\xac\xe9\x93\xe0*\xd7\x9b/)\x93\x08\xc1\x0cxhD\xd2\xf1'
# b'\xbe5\xe1\x1f:\x04\x07\xf1\xb4\xaeJ\xe2\xe0[\x9e\xa4\x9b\xed)\xbf\xc2}+\x88'
# b'\x08I^f\x82-\xa2o\xb2\xc3\x85\xc5;Z\x13B\xf76~\x9af\xf7\xa9\x1a\xa4\xd4\xb8b')
fake.boolean(chance_of_getting_true=50) # 布尔值
# True
fake.md5(raw_output=False) # Md5
# '0712ca7a3be00aa01c823de37dc61230'
fake.null_boolean() # NULL+布尔值
# True
fake.password(length=10, special_chars=True, digits=True, upper_case=True, lower_case=True) # 密码
# '^7cSoHR1^r'
fake.sha1(raw_output=False) # SHA1
# 'f89f039d9fc00860651d9a567ac27990ae609445'
fake.sha256(raw_output=False) # SHA256
# '675a85aa0d29583200f75351e35b4af0335af835fc617382cbd9fece258b6520'
fake.uuid4(cast_to=<class 'str'>) # UUID4
# '0d7be36a-febd-4f9f-bf1e-791c0ee1227b'
人物相关
fake.first_name() # 名字
# '强'
fake.first_name_female() # 名字(女)
# '桂荣'
fake.first_name_male() # 名字(男)
# '志强'
fake.first_romanized_name() # 名字(罗马文)
# 'Chao'
fake.last_name() # 姓
# '宋'
fake.last_name_female() # 姓(女)
# '陆'
fake.last_name_male() # 姓(男)
# '曾'
fake.last_romanized_name() # 姓(罗马文)
# 'Xie'
fake.name() # 姓名
# '王凯'
fake.name_female() # 姓名(女)
# '戴丽丽'
fake.name_male() # 姓名(男)
# '刘荣'
fake.prefix() # 称谓
# ''
fake.prefix_female() # 称谓(女)
# ''
fake.prefix_male() # 称谓(男)
# ''
fake.romanized_name() # 称谓(罗马文)
# 'Guiying Chang'
fake.suffix() # 姓名后缀(中文不适用)
# ''
fake.suffix_female()
# ''
fake.suffix_male()
# ''
电话相关
fake.msisdn() # 完整手机号码(加了国家和国内区号)
# '9067936325890'
fake.phone_number() # 手机号
# '18520149907'
fake.phonenumber_prefix() # 区号
# 145
档案相关
fake.profile(fields=None, sex=None) # 档案(完整)
# { 'address': '河南省昆明市清河哈尔滨路H座 496152',
# 'birthdate': datetime.date(2014, 11, 20),
# 'blood_group': 'AB+',
# 'company': '易动力信息有限公司',
# 'current_location': (Decimal('77.504143'), Decimal('-167.365806')),
# 'job': '培训策划',
# 'mail': 'liangyang@yahoo.com',
# 'name': '杨磊',
# 'residence': '澳门特别行政区台北县西夏兴城街L座 803680',
# 'sex': 'F',
# 'ssn': '140722200004166520',
# 'username': 'lei65',
# 'website': [ 'http://www.29.cn/',
# 'http://www.lei.cn/',
# 'http://lishao.net/',
# 'https://www.feng.net/']}
fake.simple_profile(sex=None) # 档案(简单)
# { 'address': '广西壮族自治区南宁市花溪孙街c座 653694',
# 'birthdate': datetime.date(1993, 12, 16),
# 'mail': 'haomin@yahoo.com',
# 'name': '任秀英',
# 'sex': 'F',
# 'username': 'iding'}
Python相关
fake.pybool() # Python布尔值
# False
fake.pydecimal(left_digits=None, right_digits=None, positive=False, min_value=None, max_value=None) # Python十进制数
# Decimal('-837022273798.0')
fake.pydict(nb_elements=10, variable_nb_elements=True, *value_types) # Python字典
# { '一种': 6381,
# '可以': -9242847.69292,
# '地址': 9668,
# '拥有': 'jVBverSGAJvHsrcZPFDg',
# '控制': Decimal('-98521.0'),
# '本站': datetime.datetime(1983, 5, 30, 22, 51, 22),
# '来源': 'MRTmgbdlwNlqHiIDUVTN',
# '标题': 929,
# '注册': 'QvYtlygVIopYPasYHCQr',
# '解决': -7138575.3,
# '问题': 1115.0}
fake.pyfloat(left_digits=None, right_digits=None, positive=False, min_value=None, max_value=None) # Python浮点数
# 6.7442382094132
fake.pyint(min_value=0, max_value=9999, step=1) # Python整型值
# 8326
fake.pyiterable(nb_elements=10, variable_nb_elements=True, *value_types) # Python可迭代对象
# {'gang42@gmail.com', Decimal('-638462592926556.0'), 5383, 1608, 185608.962728, datetime.datetime(2013, 8, 7, 10, 44, 51), 'xvqHfWdLyTkaFoguvnqd', datetime.datetime(1999, 9, 10, 4, 41, 29), Decimal('4627589014.65023'), 'http://57.cn/category/', 'UZJwIrsLowvwVGAChwzB', Decimal('68.623476938'), 'mtUbDpTHnQAPVjXzknIM'}
fake.pylist(nb_elements=10, variable_nb_elements=True, *value_types) # Python列表
# [ 589,
# 'https://www.yangbai.cn/main/',
# 'http://fang.cn/faq/',
# 'HvtSTwWqDtughQLYibOd',
# Decimal('-3541501.934427'),
# 2758,
# datetime.datetime(2018, 2, 22, 9, 51, 8),
# 5375,
# 'UVXMfCqJyZwBkfgGhQiH',
# 'HfxybvRTPwaFmuhwvKLT',
# Decimal('-21565647052012.8'),
# 'wEqWsXKTputijSMWhCIb']
fake.pyset(nb_elements=10, variable_nb_elements=True, *value_types) # Python集合
# {7105, 'sidMFYVhXjkNZnHHimJJ', 'yexiuying@kw.cn', 'GPxoyEYixUGAoRCiEmDe', datetime.datetime(2001, 6, 17, 12, 49, 57), 'vOsPAdmmCmkJxeBUpBJP', -75011.0}
fake.pystr(min_chars=None, max_chars=20) # Python字符串
# 'NOlWELuogcxSfRjYauSV'
fake.pystruct(count=10, *value_types) # Python结构
# ( [ 'SQeHWPNdooccsfbZslee',
# 'nDXibfaPXSpmIpxtDUWP',
# 'DrZHepzMfNPRrxgcXwvR',
# 988.956374402,
# 7239,
# 4885,
# datetime.datetime(1972, 6, 13, 14, 18, 11),
# -582284.9732,
# datetime.datetime(1997, 8, 23, 9, 19, 6),
# 'http://www.hu.cn/homepage.php'],
# { '一般': 'oqUQKBhqNylyofEditXs',
# '不要': 'qTlztJembuRZHFEzZnGO',
# '价格': -2100690667.387,
# '国内': datetime.datetime(1989, 9, 3, 11, 27, 11),
# '密码': 'aWaufuJAzfgeuhyXAwDL',
# '开发': 'aJvNisEMynJcAPhbNAHa',
# '方法': 'WVEqHUnnkpUbAnllUqKL',
# '汽车': 'bfQlaULiNfjgkrqQUCnL',
# '用户': 'WDYNlInLyCcIXMFgyLDS',
# '那个': 'qWivpUnOcTwGDhOXihOb'},
# { '个人': { 1: 'http://www.ik.cn/categories/tags/search/homepage/',
# 2: [ 'gBSKOBAYYlPwILaWgory',
# 'xoeueUWWgbvNHDxKYASD',
# 'nkcelmDSpqiQasuKvNZg'],
# 3: { 1: 2000,
# 2: 'SeDZKUpCxrCLlrDIlPxV',
# 3: [Decimal('7833105.737'), Decimal('-7.994')]}},
# '帖子': { 0: 'HXTKojcilYqgYmFUMjuk',
# 1: [6887, 3635, 'http://hezhu.com/list/main/terms.html'],
# 2: { 0: 'hkong@fujiang.cn',
# 1: 4676,
# 2: ['JYEFavcRqcsdpnSMwENU', 'vxu@gmail.com']}},
# '应该': { 7: 'EmzzdZrmUpIetxPktXAU',
# 8: [ Decimal('4786692875733.0'),
# datetime.datetime(2016, 10, 11, 10, 38, 20),
# 'ghtelDQAsBeYDaokgbYg'],
# 9: { 7: 'yanding@yahoo.com',
# 8: 'dtjdazSyZCStWkVYwIvK',
# 9: ['TPTzKNGReDCJmrfTkKmd', 'TKQmVfrNRioICuqCrrDQ']}},
# '我的': { 3: 'http://17.cn/home/',
# 4: [ 'https://www.guiyingsu.cn/category/',
# 'gweRIERFoojbKxRiiliG',
# 'dMjUNjDRCSpdrNAlHXRp'],
# 5: { 3: 'YeIsIoVHcIgAQWYZkQiR',
# 4: 'hGDzyNMVafuDMXSbbhzY',
# 5: [977, 'xCFBFdaPHNyFscSCqEWd']}},
# '或者': { 9: 'owgjdYQvTWZIZRewhkev',
# 10: ['nHusiXLRunAMvynwjJgu', 6500, 'cQRHfcdFJGUyPDlIocqG'],
# 11: { 9: 'sETogfbiwRIqFlrGXeiT',
# 10: 'tliang@kong.cn',
# 11: [ 'https://chaohao.cn/register.html',
# 'fang21@yahoo.com']}},
# '技术': { 4: 8843,
# 5: [-5660697068472.0, 7952, -52210308185.53],
# 6: { 4: 6477,
# 5: 8669,
# 6: ['sGueDRKWFAtTExnruySP', 'YZcIHHkbDRLUgeHhblCu']}},
# '深圳': { 5: 2532,
# 6: [ Decimal('66661967013036.0'),
# 'lei14@yahoo.com',
# 'https://www.fangyao.cn/categories/search.html'],
# 7: { 5: datetime.datetime(1988, 9, 11, 2, 30, 1),
# 6: 50.1,
# 7: [ 'https://www.gang.cn/',
# 'http://www.liao.cn/posts/app/main.html']}},
# '生产': { 2: 2187,
# 3: [ 8629589.339,
# 'QvftOABFsahZurjYIPTr',
# 'GumqSZMuOSIfrUzjTzKO'],
# 4: { 2: 1982,
# 3: 'WatxfisQAelRTuwopoOA',
# 4: ['xiacheng@00.cn', 'flrVEiuWlEnJjbxCazQG']}},
# '起来': { 6: 'luming@yahoo.com',
# 7: [ 'http://www.yu.cn/home.php',
# 'vvmhckwxQGnMCafhjXIA',
# Decimal('-511928454.48')],
# 8: { 6: 'https://www.naguiying.cn/',
# 7: 279.928,
# 8: [5034, 'shaochao@17.cn']}},
# '那么': { 8: 'PNrBODNdjLnhalWpVMXk',
# 9: [ datetime.datetime(1973, 7, 4, 11, 42, 8),
# 'iye@gmail.com',
# 'iEPyTnfNhNhWWXbkStQC'],
# 10: { 8: Decimal('-227034846260.0'),
# 9: Decimal('616424892362.0'),
# 10: [ 'AjpDMNozhUbedUuOZWdL',
# datetime.datetime(1972, 10, 27, 8, 36, 39)]}}})
fake.pytuple(nb_elements=10, variable_nb_elements=True, *value_types) # Python元组
# ( Decimal('989085669.60574'),
# 'yang44@hotmail.com',
# 794,
# datetime.datetime(1989, 12, 11, 4, 10, 40),
# 234,
# 'TyEwXywfUShjlUVwtMAk',
# 'NLUdMSRYoBHmGGPhbwor',
# -69.356824324)
身份证相关
fake.ssn(min_age=18, max_age=90) # 身份证
# '410622198603154708'
用户代理相关
fake.android_platform_token() # 安卓
# 'Android 5.0.1'
fake.chrome(version_from=13, version_to=63, build_from=800, build_to=899) # Chrome
# ('Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_10_9) AppleWebKit/534.0 (KHTML, '
# 'like Gecko) Chrome/62.0.826.0 Safari/534.0')
fake.firefox() # FireFox
# ('Mozilla/5.0 (Windows NT 5.1; cs-CZ; rv:1.9.0.20) Gecko/2010-12-02 06:14:30 '
# 'Firefox/3.6.5')
fake.internet_explorer() # Ie
# 'Mozilla/5.0 (compatible; MSIE 7.0; Windows 95; Trident/3.0)'
fake.ios_platform_token() # ios
# 'iPhone; CPU iPhone OS 5_1_1 like Mac OS X'
fake.linux_platform_token() # Linux
# 'X11; Linux i686'
fake.linux_processor() # Linux处理器
# 'x86_64'
fake.mac_platform_token() # Mac
# 'Macintosh; U; PPC Mac OS X 10_11_2'
fake.mac_processor() # Mac处理器
# 'Intel'
fake.opera() # Opera
# 'Opera/8.32.(Windows 98; Win 9x 4.90; mr-IN) Presto/2.9.188 Version/10.00'
fake.safari() # Safari
# ('Mozilla/5.0 (Windows; U; Windows NT 6.0) AppleWebKit/533.43.6 (KHTML, like '
# 'Gecko) Version/4.0.5 Safari/533.43.6')
fake.user_agent() # 随机用户代理
# 'Mozilla/5.0 (compatible; MSIE 9.0; Windows 95; Trident/3.0)'
fake.windows_platform_token() # Windows
# 'Windows NT 6.2'
Python 技巧
Python 小技巧
统计代码运行时间
1import time
2
3btime = time.time()
4a = [x**3 for x in range(10000000)]
5etime = time.time()
6print("used {:.5}s" % (etime-btime))
使用set替代list查找
1data = (i**2 for i in range(100000))
2dlst = list(data)
3dset = set(data)
4
51234 in dlst
61234 in dset
其他加速技巧
- 避免使用全局变量
- 交换变量不使用中间值
- 字符串拼接使用join
- 使用for循环替代while
Atexit
Python 退出程序时执行代码 atexit
python atexit 模块定义了一个 register 函数,用于在 python 解释器中注册一个退出函数, 这个函数在解释器正常终止时自动执行,一般用来做一些资源清理的操作。 atexit 按注册的相反顺序执行这些函数; 例如注册A、B、C,在解释器终止时按顺序C,B,A运行。
1import atexit
2
3print("some code ............")
4
5
6def exit0(*args, **kwarg):
7 print('exit0')
8 for arg in args:
9 print(' ' * 4, arg)
10
11 for item in kwarg.items():
12 print(' ' * 4, item)
13
14
15def exit1():
16 print('exit1')
17 raise Exception('exit1')
18
19
20def exit2():
21 print('exit2')
22 print(1 / 0)
23
24
25atexit.register(exit0, *[1, 2, 3], **{"a": 1, "b": 2, })
26atexit.register(exit1)
27atexit.register(exit2)
28
29
30@atexit.register
31def exit3():
32 print('exit3')
33
34
35print('other code ..............')
36
37
38if __name__ == '__main__':
39 pass
Openpyxl 操作
Openpyxl 操作
xls xlsx 文件格式转换
openpyxl是用于读取/写入Excel 2010 xlsx/xlsm文件的Python库, 也就是说openpyxl这个Python库不支持xls文件的读取和操作
可以手工打开另存转换格式 或者
1import os
2import win32com.client as win32
3filename = '.\1.xls'
4Excelapp = win32.gencache.EnsureDispatch('Excel.Application')
5workbook = Excelapp.Workbooks.Open(filename)
6# 转xlsx时: FileFormat=51,
7# 转xls时: FileFormat=56,
8workbook.SaveAs(filename.replace('xls', 'xlsx'), FileFormat=51)
9workbook.Close()
10Excelapp.Application.Quit()
11# 删除源文件
12# os.remove(filename)
13
14# 如果想将xlsx的文件转换为xls的话,则可以使用以下的代码:
15# workbook.SaveAs(filename.replace('xlsx', 'xls'), FileFormat=56)
创建、打开工作簿
1import openpyxl
2
3# 创建新工作簿
4wb = openpyxl.WorkBook()
5# 在指定位置新建工作表
6ws = wb.create_sheet('sheetname', 0)
7
8# 打开已有工作簿
9wb = openpyxl.load_workbook('xlsx_filename')
10# 打开已有工作表
11ws = wb['sheetname']
12ws1 = wb.get_sheet_by_name('sheetname')
13
14# 设置工作表标签颜色
15ws.sheet_properties.tabColor = 'ff0000'
16
17# 读取已有所有工作表名称
18for sht in ws.sheetnames:
19 print("sht : ", sht)
20# 保存并退出
21wb.save('xlsx_filename')
22wb.close()
单元格操作
1# 访问指定单元格
2cell_1 = ws['A1']
3cell_2 = ws.cell(row=1, column=1)
4
5# 返回指定单元格的值
6value_1 = ws['A1'].value
7value_2 = ws.cell(row=1, column=1).value
8
9# 设置指定单元格内容
10ws['A1'].value = 'xlsx 内容'
11ws.cell(row=1, column=1).value ='xlsx 内容'
12
13# 多个单元格
14# 访问A1至C3范围单元格
15cell_range = ws['A1':'C3']
16# 访问A列所有存在数据的单元格
17colA = ws['A']
18# 访问A列到C列所有存在数据的单元格
19col_range = ws['A:C']
20# 访问第1行所有存在数据的单元格
21row1 = ws[1]
22# 访问第1行至第5行所有存在数据的单元格
23row_range = ws[1:5]
24
25# 多行列
26for row in ws.iter_rows(min_row=1, max_col=2, max_row=2):
27 for cell in row:
28 print(cell)
29#输出:
30<Cell 'sht'.A1>
31<Cell 'sht'.B1>
32<Cell 'sht'.A2>
33<Cell 'sht'.B2>
34
35for col in ws.iter_cols(min_row=1, max_col=2, max_row=2):
36 for cell in col:
37 print(cell)
38#输出:
39<Cell 'sht'.A1>
40<Cell 'sht'.A2>
41<Cell 'sht'.B1>
42<Cell 'sht'.B2>
43
44# 单元格的常见属性
45print(ws.cell(column=2, row=9).column_letter)
46print(ws.cell(column=2, row=9).coordinate)
47print(ws.cell(column=2, row=9).col_idx)
48print(ws.cell(column=2, row=9).encoding)
49print(ws.cell(column=2, row=9).offset)
50print(ws.cell(column=2, row=9).is_date)
51print(ws.cell(column=2, row=9).data_type)
52print(ws.cell(column=2, row=9).has_style)
53print(ws.cell(column=2, row=9).style)
54print(ws.cell(column=2, row=9).style_id)
55print(ws.cell(column=2, row=9).font)
56print(ws.cell(column=2, row=9).alignment)
57print(ws.cell(column=2, row=9).border)
58print(ws.cell(column=2, row=9).fill)
59print(ws.cell(column=2, row=9).number_format)
60print(ws.cell(column=2, row=9).hyperlink)
61
62# 调整列宽和行高
63# 调整列宽
64ws.column_dimensions['A'].width = 20.0
65# 调整行高
66ws.row_dimensions[1].height = 40
67
68# 合并单元格
69ws.merge_cells("A1:B1")
70ws.merge_cells(start_column=3,end_column=5,start_row=3,end_row=5)
单元格样式设置
1from openpyxl import *
2from openpyxl.styles import PatternFill, Font, Alignment, Border, Side
3
4# 设置字体
5font = Font(name='微软雅黑',
6 size=11,
7 color='FF000000',
8 bold=True,
9 italic=True,
10 vertAlign='baseline',
11 underline='double',
12 strike=False)
13wsheet['A2'].font = font
14
15# 边线设置
16side_type = Side(border_style='mediumDashDot',color='FF000000')
17border = Border(left=side_type,
18 right=side_type,
19 top=side_type,
20 bottom=side_type,
21 diagonal=side_type,
22 diagonal_direction=30,
23 outline=side_type,
24 vertical=side_type,
25 horizontal=side_type
26 )
27
28wsheet['A3'].border = border
29# border_style的样式有:
30# ‘dashDot’,‘dashDotDot’,‘dashed’,‘dotted’,‘double’,
31# ‘hair’,‘medium’,‘mediumDashDot’,‘mediumDashDotDot’,
32# ‘mediumDashed’,‘slantDashDot’,‘thick’,‘thin’
33
34# 填充设置
35fill = PatternFill(fill_type = 'darkDown',start_color='A6DA70D6',end_color='000000')
36wsheet['A4'].fill = fill
37# fill_type类型有:'none'、'solid'、'darkDown'、'darkGray'、'darkGrid'、'darkHorizontal'、'darkTrellis'、'darkUp'、'darkVertical'、'gray0625'、
38# 'gray125'、'lightDown'、'lightGray'、'lightGrid'、'lightHorizontal'、
39# 'lightTrellis'、'lightUp'、'lightVertical'、'mediumGray'
40
41# 对齐设置
42align = Alignment(horizontal='center',vertical='center',text_rotation=0,wrap_text=True,shrink_to_fit=True,indent=0)
43wsheet['A6'].alignment = align
44# Horizontal:水平方向,左对齐left,居中center对齐和右对齐right可选。
45# Vertical:垂直方向,有居中center,靠上top,靠下bottom,两端对齐justify等可选。
46# text_rotation:文本旋转度。
47# wrap_text:自动换行
48# Indent:缩进。
49
50# 数字格式设置
51wsheet['A9'].number_format = 'd-mmm-yy'
52
53col = ws.column_dimensions['A']
54col.number_format = u'#,##0.00€'
55# 一些格式
56# 0: 'General',
57# 1: '0',
58# 2: '0.00',
59# 3: '#,##0',
60# 4: '#,##0.00',
61# 5: '"$"#,##0_);("$"#,##0)',
62# 6: '"$"#,##0_);[Red]("$"#,##0)',
63# 7: '"$"#,##0.00_);("$"#,##0.00)',
64# 8: '"$"#,##0.00_);[Red]("$"#,##0.00)',
65# 9: '0%',
66# 10: '0.00%',
67# 11: '0.00E+00',
68# 12: '# ?/?',
69# 13: '# ??/??',
70# 14: 'mm-dd-yy',
71# 15: 'd-mmm-yy',
72# 16: 'd-mmm',
73# 17: 'mmm-yy',
74# 18: 'h:mm AM/PM',
75# 19: 'h:mm:ss AM/PM',
76# 20: 'h:mm',
77# 21: 'h:mm:ss',
78# 22: 'm/d/yy h:mm',
79#
80# 37: '#,##0_);(#,##0)',
81# 38: '#,##0_);[Red](#,##0)',
82# 39: '#,##0.00_);(#,##0.00)',
83# 40: '#,##0.00_);[Red](#,##0.00)',
84#
85# 41: r'_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)',
86# 42: r'_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_)',
87# 43: r'_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)',
88#
89# 44: r'_("$"* #,##0.00_)_("$"* \(#,##0.00\)_("$"* "-"??_)_(@_)',
90# 45: 'mm:ss',
91# 46: '[h]:mm:ss',
92# 47: 'mmss.0',
93# 48: '##0.0E+0',
94# 49: '@',
使用公式
1# 所有可用公式都在这里
2from openpyxl.utils import FORMULAE
3print(len(FORMULAE))
4print(FORMULAE)
5
6
7sheet["C2"] = "=SUM(A2,B2)"
合并拆分单元格
1ws.merge_cells('A2:D2')
2ws.unmerge_cells('A2:D2')
3# or equivalently
4ws.merge_cells(start_row=2, start_column=1, end_row=4, end_column=4)
5ws.unmerge_cells(start_row=2, start_column=1, end_row=4, end_column=4)
隐藏行列
1ws.column_dimensions.group('A','D', hidden=True)
2ws.row_dimensions.group(1,10, hidden=True)
3wb.save('group.xlsx')
插入删除行列
1ws.insert_rows(7)
2ws.insert_cols(3)
3ws.delete_rows(7)
4ws.delete_cols(3)
Xlwings 操作
Xlwings 操作
创建工作簿,工作表
1import xlwings as xw
2
3# 创建一个新的App,并在新App中新建一个Book
4wb = xw.Book()
5wb.save('1.xlsx')
6wb.close()
7
8# 当前App下新建一个Book
9# visible参数控制创建文件时可见的属性
10app=xw.App(visible=False,add_book=False)
11wb=app.books.add()
12
13ws = wb.sheets.avtive
14ws1 = wb.sheets.add('新建工作表', after=ws)
15
16wb.save('1.xlsx')
17wb.close()
18#结束进程
19app.quit()
打开已有工作簿
1import xlwings as xw
2app=xw.App(visible=True,add_book=False)
3#不显示Excel消息框
4app.display_alerts=False
5#关闭屏幕更新,可加快宏的执行速度
6app.screen_updating=False
7
8wb=app.books.open('1.xlsx')
9# 输出打开的excle的绝对路径
10# print(wb.fullname)
11wb.save()
12wb.close()
13# 退出excel程序,
14app.quit()
15# 通过杀掉进程强制Excel app退出
16# app.kill()
17#
18# 以第一种方式创建Book时,打开文件的操作可如下
19wb = xw.Book('1.xlsx')
20
21app = xw.App(visible=False, add_book=False)
22app.display_alerts = False # 关闭一些提示信息,可以加快运行速度。 默认为 True。
23app.screen_updating = False # 更新显示工作表的内容。默认为 True。关闭它也可以提升运行速度。
24
25wb = app.books.open("./111.xlsx")
26ws = wb.sheets['ExportOrderList11954161104']
单元格写入
1# 在A1单元格写入值
2# 实例化一个工作表对象
3sheet1 = wb.sheets["sheet1"]
4# 或者
5# sheet1 =xw.books['1.xlsx'].sheets['sheet1']
6输出工作簿名称
7# print(sheet1.name)
8# 写入值
9sheet1.range('A1').value = 'python知识学堂'
10# 读值并打印
11print('value of A1:',sheet1.range('A1').value)
12# 清空单元格内容,如果A1中是图片,此方法没有效果
13sheet1.range('A1').clear()
14# 传入列表写入多行值
15sheet1.range('A1').value = [['a','b','c'],[1,2,3]]
16
17# 当然也可以将pandas的DataFrame数据写入
18import pandas as pd
19df = pd.DataFrame([[1,2], [3,4]], columns=['A', 'B'])
20sheet1.range('A1').value = df
21# 读取数据,输出类型为DataFrame
22sheet1.range('A1').options(pd.DataFrame, expand='table').value
单元格读取
1# 读取全部行列
2max_row, max_col = sht.used_range.last_cell.row, sht.used_range.last_cell.column
3lst = sht.range((1,1), (max_row, max_col)).value
4
5rng = sht.range('A1:D3')
6for cell in rng:
7 print(cell.value)
8
9# 读取行, 列(0起始)
10rng = sht[2:5, :3]
11for cell in rng:
12 print(cell.value)
单元格设置
1"""设置单元格大小"""
2ws.autofit() #在整个工作表上自动调整宽度,可传参数
3ws.autofit(axis='c') # 在整个工作表上自动调整列的宽度
4ws.autofit(axis='r') # 在整个工作表上自动调整行的宽度
5ws.autofit('c') # 在整个工作表上自动调整列的宽度
6ws.autofit('r') # 在整个工作表上自动调整行的宽度
7ws.range(1,4).column_width = 5 # 设置第4列 列宽。(1,4)为第1行第4列的单元格
8ws.range(1,4).row_height = 20 # 设置第1行 行高
边框线
1b3 = ws.range('b3')
2
3# Borders(9) 底部边框,LineStyle = 1 直线。
4b3.api.Borders(9).LineStyle = 1
5b3.api.Borders(9).Weight = 3 # 设置边框粗细。
6
7# Borders(7) 左边框,LineStyle = 2 虚线。
8b3.api.Borders(7).LineStyle = 2
9b3.api.Borders(7).Weight = 3
10
11# Borders(8) 顶部框,LineStyle = 5 双点划线。
12b3.api.Borders(8).LineStyle = 5
13b3.api.Borders(8).Weight = 3
14
15# Borders(10) 右边框,LineStyle = 4 点划线。
16b3.api.Borders(10).LineStyle = 4
17b3.api.Borders(10).Weight = 3
18
19# Borders(5) 单元格内从左上角 到 右下角。
20b3.api.Borders(5).LineStyle = 1
21b3.api.Borders(5).Weight = 3
22
23# Borders(6) 单元格内从左下角 到 右上角。
24b3.api.Borders(6).LineStyle = 1
25b3.api.Borders(6).Weight = 3
26
27"""如果是一个区域的单元格,内部边框设置如下"""
28# Borders(11) 内部垂直边线。
29b3.api.Borders(11).LineStyle = 1
30b3.api.Borders(11).Weight = 3
31
32# Borders(12) 内部水平边线。
33b3.api.Borders(12).LineStyle = 1
34b3.api.Borders(12).Weight = 3
使用公式
1# 使用公式
2ws.range('AB2').formula='=SUM(A1,A2)'
基础代码
1# coding=utf-8
2import xlwings as xw
3# 设置程序不可见运行
4app = xw.App(visible=False, add_book=False)
5
6# =============== 第一部分,创建并写入数据 =====================
7# 创建一个test2.xlsx表,并写入数据
8# wb = app.books.add()
9# ws = wb.sheets.active
10# arr = []
11# for col in range(1,4):
12# arr_temp = []
13# for row in range(1,4):
14# arr_temp.append(col*10+row)
15# arr.append(arr_temp)
16# ws.range('A1:B3').value=arr
17# wb.save('data/test2.xlsx')
18# wb.close()
19# app.quit()
20# exit()
21
22# ============== 第二部分,插入、删除行和列 ========================
23
24# 导入已存的demo表格
25load_wb = app.books.open('data/test2.xlsx')
26# # 打开活动的工作薄的活动工作簿,或者指定的工作簿
27load_ws = load_wb.sheets.active
28# load_ws = load_wb.sheets['Sheet']
29
30# 获取总行数(存在数据)
31rows = load_ws.api.UsedRange.Rows.count
32cols = load_ws.api.UsedRange.Columns.count
33# print('该表格总共有:'+str(rows)+' 行')
34# print('该表格总共有:'+str(cols)+' 列')
35# exit()
36
37
38# 1-①在第二行前插入2行(可理解为: 在第2-4行插入空白行)
39# load_ws.api.rows('2:4').insert
40# 1-②删除第2-4行
41# load_ws.api.rows('2:4').delete
42# 2-①在第二列前插入2列(这里处理的不是很好,其实是增加了对应区域的单元格,并未直接增加列)
43# load_ws.range('B1:C'+str(cols)).api.insert
44# 2-②删除第2-4列
45# load_ws.range('B1:C'+str(cols)).api.delete
46
47# ============== 第三部分,修改指定单元格的值 ========================
48# load_ws.range('A1').value = 'x11'
49
50# ============== 第四部分,合并单元格 ========================
51# load_ws.range('A1:A2').api.merge
52
53# ============== 第五部分,获取单元格横纵坐标index ========================
54rng=xw.Range('B2')
55# 返回当前格子的行值
56# print(rng.row)
57# 返回当前格子的列值
58# print(rng.column)
59# 返回和设置当前格子的高度和宽度
60print(rng.width)
61print(rng.height)
62rng.row_height=40
63rng.column_width=50
64# 指定单元格的高度和宽度自适应
65# rng.columns.autofit()
66rng.rows.autofit()
67print(rng.width)
68print(rng.height)
69# load_ws.range('A1:A2').api.height = 20
70
71
72# ============== 第六部分,其它 ========================
73# lst=load_ws.range('A1:A'+str(load_ws['A1048576'].end('up').row)).value #把excel单列值读取到列表中
74# lst1=load_ws.range('A1:C'+str(load_ws['A1048576'].end('up').row)).value # 把excel连续两个列的值读取到列表中
75# lst=load_ws.range('A1:A'+str(load_ws['A1048576'].end('up').row)).value #A列的值
76# lst2=load_ws.range('C1:C'+str(load_ws['A1048576'].end('up').row)).value#C列的值
77# lst3=list(zip(lst,lst2))#合并起来然后转为列表
78# dicta=dict(lst3)#列表转为字典
79
80# ============== 第七部分,Office操作文档 ========================
81# https://docs.microsoft.com/en-us/office/vba/api/excel.range(object)
82
83
84
85load_wb.save()
86load_wb.close()
87app.quit()
待续……
Python Decorator
普通函数装饰器
函数接收一个 函数名 作为参数 内部定义一个函数, 接收参数, 然后 内部函数内部 执行接收的函数名 最后外部函数返回内部函数
def loger(fun):
def show(*args, **kwargs):
print("记录日志->执行前")
fun(*args, **kwargs)
print("记录日志->执行后")
return show
@loger
def xiaoming():
print("function is running......")
@loger
def jack():
print("function is running......")
xiaoming()
jack()
print("---" * 30)
可接收参数的普通函数装饰器
在不接受参数的装饰器基础上, 外面增加一层函数, 接收参数
def say_hello(contry):
def loger(fun):
def show(*args, **kwargs):
if contry == 'china':
print('中国')
elif contry == 'english':
print('English')
print("记录日志->执行前")
fun(*args, **kwargs)
print("记录日志->执行后")
return show
return loger
@say_hello('china')
def xiaoming():
print("function is running......")
@say_hello('english')
def jack():
print("function is running......")
xiaoming()
jack()
print("---" * 30)
普通类装饰器
init 接收被装饰的函数名 call 接收参数
class Loger(object):
def __init__(self, fun):
self.fun = fun
def __call__(self, *args, **kwargs):
print("before fun run")
self.fun(*args, **kwargs)
print("after fun run")
@Loger
def xiaoming():
print("function is running......")
@Loger
def jack():
print("function is running......")
xiaoming()
jack()
print("---" * 30)
可接收参数的类装饰器
init 接收参数 call 接收被装饰的函数名, 内部定义一个函数接收参数, 并执行外部接收的函数名
class SLoger(object):
def __init__(self, contry):
self.contry = contry
def __call__(self, fun):
def show(*args, **kwargs):
if self.contry == 'china':
print("中国")
elif self.contry == 'english':
print("English")
print("before fun run")
fun(*args, **kwargs)
print("after fun run")
return show
@SLoger('china')
def xiaoming():
print("function is running......")
@SLoger('english')
def jack():
print("function is running......")
xiaoming()
jack()
print("---" * 30)
Jupyter Notebook
Linux服务器上搭建jupyter notebook / jupyterlab
安装基础软件
1pip install ipython jupyter
2pip install jupyterlab
生成配置文件
jupyter notebook --generate-config
Writing default config to: /root/.jupyter/jupyter_notebook_config.py
jupyter lab --generate-config
生成秘钥
1# ipython
2In [1]: from notebook.auth import passwd
3In [2]: passwd()
4Enter password:
5Out[2]: 'argon2:$argon2id$v=19$m=10240,t=10,p=8$Sunk/A1dg/SA'
编辑配置文件
c.NotebookApp.ip = '*' # 对外提供访问的ip
c.NotebookApp.port = 8888 # 对外提供访问的端口
c.NotebookApp.open_browser = False # 启动不打开浏览器
c.NotebookApp.password = 'sha1:f8b5f5dbeca8:d1f5b93d5e787e4bf1bf4ad2c48c177ba79f55dd' # 上面生成的秘钥
c.NotebookApp.notebook_dir = '/root/jupyter_dir' # 设置jupyter启动后默认文件夹
c.NotebookApp.allow_root = True # 允许root用户执行
插件安装
pip install jupyter_contrib_nbextensions
jupyter contrib nbextension install --user
pip install jupyter_nbextensions_configurator
jupyter nbextensions_configurator enable --user
pip install jupyterthemes
jt -l # 列出可选的主题
# -f(字体) -fs(字体大小) -cellw(占屏比或宽度) -ofs(输出段的字号) -T(显示工具栏) -N(显示自己主机名)
jt -t monokai -f fira -fs 9 -ofs 9 -dfs 9 -T -N
后台运行
nohup jupyter notebook &>./jupyter.log &
nohup jupyter lab --allow-root &>./jupyter.log &
重启脚本
rejn(){
pid=$(ps aux | grep jupyter-notebook | grep -v 'grep' | awk '{print $2}')
kill -9 ${pid}
nohup jupyter notebook &>./jupyter.log &
}
rejl(){
pid=$(ps aux | grep jupyter-lab | grep -v 'grep' | awk '{print $2}')
kill -9 ${pid}
nohup jupyter lab --allow-root &>./jupyterlab.log &
}
Arrow_api
安装
pip install arrow
引入
import arrow
获取时间, 及各个字段值
now = arrow.now()
print(now)
print(now.year, now.month, now.day, now.hour, now.minute, now.second, now.microsecond)
print(now.tzinfo, now.fold, now.timestamp)
print('-'*12)
print(now.format())
print(now.format('YYYY-MM-DD HH:mm:ss'))
print('-'*12)
utc时间
utcnow = arrow.utcnow()
print(utcnow)
print('-'*12)
字符串转时间
t = arrow.get("2020-10-11 12:34:45", "YYYY-MM-DD HH:mm:ss")
print(t)
print('-'*12)
时间戳转时间
t = arrow.get(1604555923)
print(t)
print('-'*12)
指定时间
t = arrow.get(2020, 12, 23, 9, 10, 11)
print(t)
print('-'*12)
时间推移
years, months, days, hours, minutes, seconds, microseconds, weeks, quarters, weekday
t = arrow.now()
print(t)
print(t.replace(year=2011, hour=11))
t = arrow.now()
print(t)
print(t.shift(days=1))
print(t.shift(days=-1))
print('-'*12)
范围和跨度
print(arrow.now().span('hours'))
print(arrow.now().span('days'))
只获取两端
print(arrow.now().floor("days"))
print(arrow.now().ceil("days"))
print('-'*12)
指定时间段内指定间隔的所有时间点
b = arrow.now().shift(days=-2).datetime
e = arrow.now().shift(days=+2).datetime
for item in arrow.now().range('days', b, e):
print(item, item.format('YYYY-MM-DD HH:mm:ss'))