版本共存

手工配置

在安装Python3(>=3.3)时,Python的安装包实际上在系统中安装了一个启动器py.exe,默认放置在文件夹C:\Windows\下面。这个启动器允许我们指定使用Python2还是Python3来运行代码(当然前提是你已经成功安装了Python2和Python3)。
运行代码:

1
2
py -2 hello.py    #python2
py -3 hello.py #python3

如果你觉得参数 -2/-3 麻烦,由于 py.exe 这个启动器允许你在代码里面加入说明,指示这个文件是用python2还是3版本运行,可以在代码文件最前面加入一行说明
python2版本(编码说明可以放在第二行)

1
2
#!python2
#coding:gbk12

python3版本

1
#!python3

这样就可以直接运行

1
py hello.py  #将自动转入相应版本1

当2和3同时存在Windows上时,他们对应的pip都叫pip.exe,所以不能直接使用 pip install 命令安装软件包,而是依靠py.exe来指定pip版本。

1
2
py -2 -m pip install *****  #python2
py -3 -m pip install ***** #python3
  • 系统优先级

按照环境变量的前后,如以 python 2 为 优先:

设置环境变量PATH为:

1
C:\Python27;C:\Python27\Scripts;C:\Python36\Scripts\;C:\Python36\;

Pyenv

pyenv是一个forked自ruby社区的简单、低调、遵循UNIX哲学的Python环境管理工具,用于安装和管理多个Python版本。它使开发人员能够快速访问更新版本的Python,并保持系统干净,避免不必要的包膨胀。它还提供了从 Python 的一个版本快速切换到另一个版本的能力,以及指定给定项目使用的Python版本并可以自动切换到该版本, 同时结合vitualenv插件可以方便的管理对应的包源
github:
https://github.com/pyenv/pyenv
https://github.com/pyenv-win/pyenv-win

linux
  • 安装依赖

    1
    apt install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python-openssl git
  • clone存储库

    1
    git clone https://github.com/pyenv/pyenv.git ~/.pyenv
  • 配置环境

    1
    2
    3
    4
    5
    6
    # 设置一些重要的环境变量并设置 pyenv 自动完成
    echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
    echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
    echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.bashrc
    # 重新启动 shell
    exec "$SHELL"
  • 验证安装

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 列出可用的 Python 版本
    pyenv install --list
    # 安装python版本(Pyenv从源代码构建,时间较长)
    pyenv install 3.8.10
    # 验证Python版本是否已安装
    pyenv versions
    # 将Python的版本更改为 3.8.10并放入 python shell
    pyenv global 3.8.10
    python
  • 命令

    参阅 pyenv help <command>

    • –version :: 显示 pyenv命令的版本列出所有可用的 pyenv 命令
    • exec :: 使用选定的 Python 版本运行可执行文件
    • global :: 设置或显示全局 Python 版本
    • help :: 显示命令的帮助
    • hooks :: 列出给定 pyenv 命令的钩子脚本
    • init :: 配置pyenv的shell环境
    • install :: 使用 python-build 安装 Python 版本
    • local :: 设置或显示本地应用程序特定的 Python 版本
    • prefix :: 显示 Python 版本的前缀
    • rehash :: Rehash pyenv shims(在安装可执行文件后运行)
    • root :: 显示保存版本和垫片的根目录
    • shell :: 设置或显示特定于 shell 的 Python 版本
    • shims:: 列出现有的 pyenv 垫片
    • uninstall:: 卸载特定的 Python 版本
    • version :: 显示当前的 Python 版本及其来源
    • version-file :: 检测设置当前pyenv版本的文件
    • version-name :: 显示当前 Python 版本
    • version-origin ::解释当前 Python 版本是如何设置的
    • versions::列出 pyenv 可用的所有 Python 版本
    • whence ::列出包含给定可执行文件的所有 Python 版本
    • which ::显示可执行文件的完整路径
windows
  • 安装

    1
    choco install pyenv-win
  • 命令

    • commands 列出所有可用的 pyenv 命令
    • local 设置或显示本地应用程序特定的 Python 版本
    • global 设置或显示全局 Python 版本
    • shell 设置或显示特定于 shell 的 Python 版本
    • install 安装 1 个或多个版本的 Python
    • uninstall 卸载 1 个或多个版本的
    • Python Python更新 更新缓存版本 DB
    • rehash Rehash pyenv shims(在切换 Python 版本后运行)
    • vname 显示当前 Python
    • version 显示当前 Python 版本及其原始
    • version-name 显示当前 Python
    • versions 列出 pyenv 可用的所有 Python 版本
    • exec 通过首先准备 PATH 来运行可执行文件,以便选择的 Python
    • which 显示可执行文件的完整路径,
    • whence 列出包含给定可执行文件的所有 Python 版本

包管理

  • 更新
1
pip install --upgrade pip   

镜像源

  • 查看
1
pip config list
  • 设置
1
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
  • 常用源
1
2
3
4
5
6
7
8
9
10
# 阿里云
https://mirrors.aliyun.com/pypi/simple/
# 清华大学
https://pypi.tuna.tsinghua.edu.cn/simple/
# 中国科技大学
https://pypi.mirrors.ustc.edu.cn/simple/
# 中国科学技术大学
https://pypi.mirrors.ustc.edu.cn/simple/
# 豆瓣
https://pypi.douban.com/simple/

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
"(py -2/3 -m)pip"
#查看已经安装的第三方库
pip list
# 安装第三方库
pip install 库名
# 查看安装库的详细信息
pip show 库名
# 卸载第三方库
pip uninstall 库名
# 卸载pip
python -m pip uninstall pip
# 检查哪些包需要更新
pip list --outdated
# 升级包
pip install --upgrade SomePackage
centos自带python2.7.5安装pip yum install -y python-pip

安装指定版本

1
2
#只需通过 == 操作符指定
pip install robotframework==2.8.7

问题解决

1
2
3
4
5
6
pip升级format问题:
先确保你在~/.pip 目录下有文件pip.conf
如果没有就创建这个文件:vim ~/.pip/pip.conf
在pip.conf文件里面加入代码:
[list]
format=columns

虚拟环境

确保 Python 已经具备虚拟环境配置库:

1
pip install virtualenv

在某一文件夹下创建虚拟环境:

1
virtualenv venv

虚拟环境生效
使用虚拟环境的二进制目录中的脚本来“激活”该环境。不同平台调用的脚本是不同的(须将 <venv> 替换为包含虚拟环境的目录路径)

平台 Shell 用于激活虚拟环境的命令
POSIX bash/zsh/git-bash $ source /bin/activate
fish $ source /bin/activate.fish
csh/tcsh $ source /bin/activate.csh
PowerShell Core $ /bin/Activate.ps1
Windows cmd.exe C:> \Scripts\activate.bat
PowerShell PS C:> \Scripts\Activate.ps1

命名规范

1
2
3
4
5
6
7
8
9
10
1. 变量命名总结:
- 单下划线开头变量:protected
- 双下划线开头变量:private
- 双下划线开头,双下划线结尾:系统内置变量
2. 函数命名总结:
- 私有方法:小写和一个前导下划线
- 特殊方法(魔术方法):小写和两个前导下划线,两个后置下划线
- 函数参数:小写和下划线,缺省值等号两边无空格
3. 类名称命名:
- 类总是使用驼峰格式命名,即所有单词首字母大写其余字母小写
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
"""
★类名称命名:
类总是使用驼峰格式命名,即所有单词首字母大写其余字母小写。
类名应该简明,精确,并足以从中理解类所完成的工作。
常见的一个方法是使用表示其类型或者特性的后缀,例如:SQLEngine ,MimeTypes
对于基类而言,可以使用一个 Base 或者 Abstract 前缀
不要滥用 *args 和 **kwargs,可能会破坏函数的健壮性
"""
# 变量命名总结:
# 1.单下划线开头变量:protected
# 2.双下划线开头变量:private
# 3.双下划线开头,双下划线结尾:系统内置变量
"""
单下划线开头变量
_xxx,单下划线开头的变量,标明是一个受保护(protected)的变量,原则上不允许直接访问,但外部类还是可以访问到这个变量。
这只是程序员之间的一个约定,用于警告说明这是一个私有变量,外部类不要去访问它。
print(stu._name) 当要输入_name时,pycharm不会进行_name的提示
print(stu.age) 当要显示age时,pycharm会进行age的提示
"""
class Student:
def __init__(self, name, sex):
self._name = name
self.sex = sex
stu = Student('zyf', 'Male')
print(stu._name) # 单下划线protected的变量,原则上不允许直接访问 输出:zyf
print(stu.sex) # age可以直接访问 输出:Male

"""
双下划线开头
__xxx,双下划线开头的,表示的是私有类型(private)的变量。
只能是允许这个类本身进行访问了, 连子类也不可以.
用于命名一个类属性(类变量),调用时名字被改变
(在类Student内部,__name变成_Student__name,如 self._Student__name)
双下划线开头的实例变量是不是一定不能从外部访问呢?其实也不是。仍然可以通过_Student__name来访问__name变量:
"""
class Person:
def __init__(self, name):
self.__name = name
per = Person('zyf2')
print(per._Person__name) # 输出zyf2 但是无法直接访问__name

"""
双下划线开头,并且以双下划线结尾
__xxx__,以双下划线开头,并且以双下划线结尾的,是内置变量.
内置变量是可以直接访问的,不是 private 变量,如__init__,__import__或是__file__。
★不要自己定义这类变量
xxx_,单下划线结尾的变量一般只是为了避免与 Python 关键字的命名冲突
USER_CONSTANT,大写加下划线,对于不会发生改变的全局变量,使用大写加下划线
"""

# 函数命名总结:
# 1.私有方法:小写和一个前导下划线
# 2.特殊方法(魔术方法):小写和两个前导下划线,两个后置下划线
# 3.函数参数:小写和下划线,缺省值等号两边无空格

"""
函数
总体而言应该使用,小写和下划线
私有方法 : 小写和一个前导下划线
这里和私有变量一样,并不是真正的私有访问权限。
同时也应该注意一般函数不要使用两个前导下划线(当遇到两个前导下划线时,Python 的名称改编特性将发挥作用)。特殊函数后面会提及。
#特殊方法 : 小写和两个前导下划线,两个后置下划线
#这种风格只应用于特殊函数,比如操作符重载等。
#函数参数 : 小写和下划线,缺省值等号两边无空格
"""
# 私有方法
class PrivateCase:
@staticmethod
def _secrete():
print(r"Don't test me")
priC = PrivateCase()
priC._secrete() # _secrete为protected member

# 特殊方法(魔术方法)
def __add__(self, other):
return int.__add__(other)

# 函数参数
def connect(self, user=None):
self._user = user

常用类库

str

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
1.是否以start开头:str.startswith('start')
是否以end结尾:str.endswith('end')
是否全为字母或数字:str.isalnum()
是否全字母:str.isalpha()
是否全数字:str.isdigit()
是否全⼩写:str.islower()
是否全⼤写:str.isupper()
2.全部⼤写:str.upper()
全部⼩写:str.lower()
⼤⼩写互换:str.swapcase()
⾸字母⼤写,其余⼩写:str.capitalize()
⾸字母⼤写:str.title()
3.搜索指定字符串,没有返回-1:str.find('t')
指定起始位置搜索:str.find('t',start)
指定起始及结束位置搜索:str.find(’t',start,end)
从右边开始查找:str.rfind('t')
搜索到多少个指定字符串:str.count('t')
上⾯所有⽅法都可⽤index代替,不同的是使⽤
index查找不到会抛异常,⽽find返回-1
1. 替换old为new:str.replace('old','new')
替换指定次数的old为new:
str.replace(‘old','new',maxReplaceTimes)
2. 去两边空格:str.strip()
去左空格:str.lstrip()
去右空格:str.rstrip()
去两边字符串:str.strip(‘d’)
相应的也有lstrip,rstrip
3. str.join() ⽅法⽤于将序列中的元素以指
定的字符连接⽣成⼀个新的字符串。
s1.join(seq),s1=“-“,seq是你要连接的序列
4. print('Hi, %s, you have $%d.' % ('linda',
100000000))
print('Hello, {0}, 成绩提升了
{1:.1f}%'.format('⼩明', 17.125))

os

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
os.sep:取代操作系统特定的路径分隔符
os.name:指⽰你正在使⽤的⼯作平台。⽐如对于Windows,它是'nt',⽽对于Linux/Unix⽤户,它是'posix'
os.getcwd:得到当前⼯作⽬录,即当前python脚本⼯作的⽬录路径。
os.getenv()和os.putenv:分别⽤来读取和设置环境变量
os.listdir():返回指定⽬录下的所有⽂件和⽬录名
os.remove(file):删除⼀个⽂件
os.stat(file):获得⽂件属性
os.chmod(file):修改⽂件权限和时间戳
os.mkdir(name):创建⽬录
os.rmdir(name):删除⽬录
os.removedirs(r“c:\python”):删除多个⽬录
os.system():运⾏shell命令
os.exit():终⽌当前进程
os.linesep:给出当前平台的⾏终⽌符。例如,Windows使⽤'\r\n',Linux使⽤'\n'⽽Mac使⽤'\r'
os.path.split():返回⼀个路径的⽬录名和⽂件名
os.path.isfile()和os.path.isdir()分别检验给出的路径是⼀个⽬录还是⽂件
os.path.existe():检验给出的路径是否真的存在
os.listdir(dirname):列出dirname下的⽬录和⽂件
os.getcwd():获得当前⼯作⽬录
os.curdir:返回当前⽬录('.'
os.chdir(dirname):改变⼯作⽬录到dirname
os.path.isdir(name):判断name是不是⽬录,不是⽬录就返回false
os.path.isfile(name):判断name这个⽂件是否存在,不存在返回false
os.path.exists(name):判断是否存在⽂件或⽬录name
os.path.getsize(name):或得⽂件⼤⼩,如果name是⽬录返回0L
os.path.abspath(name):获得绝对路径
os.path.isabs():判断是否为绝对路径
os.path.normpath(path):规范path字符串形式
os.path.split(name):分割⽂件名与⽬录(事实上,如果你完全使⽤⽬录,它也会将最后⼀个⽬录作为⽂件名⽽分离,同时它不会判断⽂件或⽬录是否存在)
os.path.splitext():分离⽂件名和扩展名
os.path.join(path,name):连接⽬录与⽂件名或⽬录
os.path.basename(path):返回⽂件名
os.path.dirname(path):返回⽂件路径

Error

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
AssertionError 断⾔语句(assert)失败
AttributeError 尝试访问未知的对象属性
EOFError ⽤户输⼊⽂件末尾标志EOF(Ctrl+d)
ImportError 导⼊模块失败的时候
IndexError 索引超出序列的范围
KeyError 字典中查找⼀个不存在的关键字
KeyboardInterrupt ⽤户输⼊中断键(Ctrl+c)
MemoryError 内存溢出(可通过删除对象释放内存)
NameError 尝试访问⼀个不存在的变量
NotImplementedError 尚未实现的⽅法
OSError 操作系统产⽣的异常(例如打开⼀个不存在的⽂件)
OverflowError 数值运算超出最⼤限制
RuntimeError ⼀般的运⾏时错误
StopIteration 迭代器没有更多的值
SyntaxError Python的语法错误
IndentationError 缩进错误
TabError Tab和空格混合使⽤
SystemError Python编译器系统错误
SystemExit Python编译器进程被关闭
TypeError 不同类型间的⽆效操作
UnboundLocalError 访问⼀个未初始化的本地变量(NameError的⼦类)
ValueError 传⼊⽆效的参数
ZeroDivisionError 除数为零

连接数据库

python连接数据库

pyton连接数据库需要先安装pymysql模块:pip install pymysql
安装完成后导入pymysql模块:import pymysql
python连接数据库主要分五个步骤:
step1:连接数据库
step2:创建游标对象
step3:对数据库进行增删改查
step4:关闭游标
step5:关闭连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# 1. 连接数据库,
conn = pymysql.connect(
host='localhost',
user='root',
password='redhat',
db='helloTest',
charset='utf8',
# autocommit=True, # 如果插入数据,, 是否自动提交? 和conn.commit()功能一致。
)
# ****python, 必须有一个游标对象, 用来给数据库发送sql语句, 并执行的.
# 2. 创建游标对象,
cur = conn.cursor()
# 3. 对于数据库进行增删改查
# 1). ************************创建数据表**********************************
try:
create_sqli = "create table hello (id int, name varchar(30));"
cur.execute(create_sqli)
except Exception as e:
print("创建数据表失败:", e)
else:
print("创建数据表成功;")
## 2). *********************插入数据****************************
try:
insert_sqli = "insert into hello values(2, 'fensi');"
cur.execute(insert_sqli)
except Exception as e:
print("插入数据失败:", e)
else:
# 如果是插入数据, 一定要提交数据, 不然数据库中找不到要插入的数据;
conn.commit()
print("插入数据成功;")
# 3). *********************插入多条数据****************************
try:
info = [(i, "westos%s" %(i)) for i in range(100)]

# *********************第一种方式********************
# %s必须手动添加一个字符串, 否则就是一个变量名, 会报错.
insert_sqli = "insert into hello values(%d, '%s');"
for item in info:
print('insert语句:', insert_sqli %item)
cur.execute(insert_sqli %item)

# *********************第二种方式********************
insert_sqli = "insert into hello values(%s, %s);"
cur.executemany(insert_sqli, info )
except Exception as e:
print("插入多条数据失败:", e)
else:
# 如果是插入数据, 一定要提交数据, 不然数据库中找不到要插入的数据;
conn.commit()
print("插入多条数据成功;")
# 4). **************************数据库查询*****************************
sqli = "select * from hello;"
result = cur.execute(sqli) # 默认不返回查询结果集, 返回数据记录数。
print(result)
print(cur.fetchone()) # 1). 获取下一个查询结果集;
print(cur.fetchone())
print(cur.fetchone())
print(cur.fetchmany(4)) # 2). 获取制定个数个查询结果集;
info = cur.fetchall() # 3). 获取所有的查询结果
print(info)
print(len(info))
print(cur.rowcount) # 4). 返回执行sql语句影响的行数
# 5). 移动游标指针
print(cur.fetchmany(3))
print("正在移动指针到最开始......")
cur.scroll(0, 'absolute')
print(cur.fetchmany(3))
print("正在移动指针到倒数第2个......")
print(cur.fetchall()) # 移动到最后
cur.scroll(-2, mode='relative')
print(cur.fetchall())
# 4. 关闭游标
cur.close()
# 5. 关闭连接
conn.close()

获取表的字段名和信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#首先导入所需要的模块
import time
import pymysql
#然后进入主程序部分:此部分用with语句编写(with语句实现的效果是: with语句执行结束, 如果成功, 则提交改变的数据, 如果不成功, 则回滚.)
conn = pymysql.connect(
host='localhost',
user='root',
password='redhat',
db='helloTest',
charset='utf8',
# autocommit=True, # 如果插入数据,, 是否自动提交? 和conn.commit()功能一致。
) #连接数据库
with conn: #主程序with语句部分
# ****** 判断是否连接?
print(conn.open) # True
# 2. 创建游标对象,
cur = conn.cursor()
# 3).
sqli = "select * from hello;"
result = cur.execute(sqli) # 默认不返回查询结果集, 返回数据记录数。
# 显示每列的详细信息
des = cur.description
print("表的描述:", des)
# 获取表头
print("表头:", ",".join([item[0] for item in des]))
cur.close() #关闭游标,with语句内部
conn.close() #关闭指针,with语句外部
print("with语句之外:", conn.open) # 正确情况下会是False

基于mysql数据库银行转账功能实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#银行转账系统考虑因素主要包括:
#1). 判断两个银行卡号是否存在?
#2). 判断source_id是否有足够的钱?
#3). source_id扣钱
#4). target_id加钱
#测试时,首先在数据库中构造数据表bankData,在数据表中添加用户信息(包括用户帐号和账户内金额)
import pymysql
class TransferMoney(object):
# 构造方法
def __init__(self, conn):
self.conn = conn
self.cur = conn.cursor()
def transfer(self, source_id, target_id, money):
if not self.check_account_avaialbe(source_id):
raise Exception("账户不存在")
if not self.check_account_avaialbe(target_id):
raise Exception("账户不存在")
if self.has_enough_money(source_id, money):
try:
self.reduce_money(source_id, money)
self.add_money(target_id, money)
except Exception as e:
print("转账失败:", e)
self.conn.rollback()
else:
self.conn.commit()
print("%s给%s转账%s金额成功" % (source_id, target_id, money))

def check_account_avaialbe(self, acc_id):
"""判断帐号是否存在, 传递的参数是银行卡号的id"""
select_sqli = "select * from bankData where id=%d;" % (acc_id)
print("execute sql:", select_sqli)
res_count = self.cur.execute(select_sqli)
if res_count == 1:
return True
else:
# raise Exception("账户%s不存在" %(acc_id))
return False

def has_enough_money(self, acc_id, money):
"""判断acc_id账户上金额> money"""
# 查找acc_id存储金额?
select_sqli = "select money from bankData where id=%d;" % (acc_id)
print("execute sql:", select_sqli)
self.cur.execute(select_sqli) # ((1, 500), )
# 获取查询到的金额钱数;
acc_money = self.cur.fetchone()[0]
# 判断
if acc_money >= money:
return True
else:
return False

def add_money(self, acc_id, money):
update_sqli = "update bankData set money=money+%d where id=%d" % (money, acc_id)
print("add money:", update_sqli)
self.cur.execute(update_sqli)

def reduce_money(self, acc_id, money):
update_sqli = "update bankData set money=money-%d where id=%d" % (money, acc_id)
print("reduce money:", update_sqli)
self.cur.execute(update_sqli)
# 析构方法
def __del__(self):
self.cur.close()
self.conn.close()

if __name__ == '__main__':
# 1. 连接数据库,
conn = pymysql.connect(
host='localhost',
user='root',
password='redhat',
db='helloTest',
charset='utf8',
autocommit=True, # 如果插入数据,, 是否自动提交? 和conn.commit()功能一致。
)
trans = TransferMoney(conn)
trans.transfer(13997, 13998, 200) #账户13997向13998转账200

execl与xmind

问题

xlrd.biffh.XLRDError: Excel xlsx file; not supported

1
2
3
4
5
6
# 原因是最近xlrd更新到了2.0.1版本,只支持.xls文件。所以pandas.read_excel(‘xxx.xlsx’)会报错。
# 可以安装旧版xlrd
pip uninstall xlrd
pip install xlrd==1.2.0
# 也可以用openpyxl代替xlrd打开.xlsx文件:
df=pandas.read_excel(‘data.xlsx’,engine=‘openpyxl’)

装饰器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import random
import time


def time_count(func):
def wrap(*args, **kwargs):
time_flag = time.time()
temp_result = func(*args, **kwargs)
print(("time cost:", time.time() - time_flag))
return temp_result

return wrap


@time_count
def loop_time(x, y):
result = 0
for i in range(x, y):
time.sleep(random.choice((0.1, 0.2, 0.3)))
result = x + y
return result

if __name__ == '__main__':
print((loop_time(1, 2)))

远程操作linux

1
pip install paramiko
1
2
3
4
5
6
7
8
第一步:导入paramiko
第二步:创建SSHClient实例对象:ssh = paramiko.SSHClient()
第三步:即使没有公钥也可以访问:ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
第四步:连接远程linux机器:ssh.connect('linux所在机器的host',SSH端口号一般默认22,‘登录linux的用户名’,‘对应的密码’)
第四步:执行linux命令:ssh.excute_command('pwd'),执行多条命令用;隔开
第五步:获取输入输出及错误:把第四步赋值给stdin,stdout,stderr = ssh.excute_command('pwd;mkdir aaaa;ls')
传文件:sftp = ssh.open_sftp() sftp.put('源文件',“要拷贝的地址”) sftp.get()--从Linux往Windows拷贝
结束时候一定要加上 ssh.close

example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import paramiko

# 创建SSHClient实例对象
ssh = paramiko.SSHClient()
# 调用方法,标识没有远程机器的公钥,允许访问
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接远程机器 地址端口用户名密码
ssh.connect("192.168.13.128",22,"root","111111")
# 创建目录
ssh.exec_command("pwd")
ssh.exec_command("mkdir test")
ssh.exec_command("cd test")
stdin,stdout,stderr = ssh.exec_command("pwd")
print(stdout.read())
ssh.close()
1
2
3
4
5
6
7
8
9
10
11
import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('192.168.13.128',22,'root','111111')
stdin,stdout,stderr = ssh.exec_command('ls')
print(stdout.read())
sftp = ssh.open_sftp()
sftp.put(r'E:\Downloads\test.py','/home/test.py')
stdin,stdout,stderr = ssh.exec_command('ls;cd /home;ls;pwd')
print(stdout.read())

json比较

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from jsoncompare import jsoncompare as json_comp

json_comp.long = int
json_comp.unicode = str
json_comp.xrange = range


a = [
{
"Key": "managed",
"Value": "yes"
}
]

b = [
{
"Key": "managed",
"Value": "No"
}
]

# Compare respecting each array's order
json_comp.are_same(a, b)

print(json_comp.are_same(a, b)[1])

python2exe

环境准备

最好用虚拟环境,不加其他无关的依赖

1
pip install pyinstaller 

favicon.ico在线制作:http://www.favicon-icon-generator.com/

构建exe执行文件

1
2
3
4
5
Pyinstaller -F -w -i mergepdf.ico mergepdf.py

Pyinstaller -F mergepdf.py 打包exe
Pyinstaller -F -w mergepdf.py 不带控制台的打包
Pyinstaller -F -w -i mergepdf.ico mergepdf.py 打包指定exe图标打包

官方文档:https://pyinstaller.readthedocs.io/en/stable/usage.html

参数

-h,–help 查看该模块的帮助信息
-F,-onefile 产生单个的可执行文件
-D,–onedir 产生一个目录(包含多个文件)作为可执行程序
-a,–ascii 不包含 Unicode 字符集支持
-d,–debug 产生 debug 版本的可执行文件
-w,–windowed,–noconsolc 指定程序运行时不显示命令行窗口(仅对 Windows 有效)
-c,–nowindowed,–console 指定使用命令行窗口运行程序(仅对 Windows 有效)
-o DIR,–out=DIR 指定 spec 文件的生成目录。如果没有指定,则默认使用当前目录来生成 spec 文件
-p DIR,–path=DIR 设置 Python 导入模块的路径(和设置 PYTHONPATH 环境变量的作用相似)。也可使用路径分隔符(Windows 使用分号,Linux 使用冒号)来分隔多个路径
-n NAME,–name=NAME 指定项目(产生的 spec)名字。如果省略该选项,那么第一个脚本的主文件名将作为 spec 的名字

参考

https://blog.csdn.net/weixin_42052836/article/details/82315118