Openpyxl 操作续

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安装时开启代理的错误

开启本地代理安装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 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基础

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 技巧

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

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 操作

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 操作

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

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

Jupyter Notebook / jupyterlab

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

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'))