Python-Tools

基于Python的工具包与框架

Posted by Hao on September 23, 2021

Jupyter notebook

Jupyter Notebook 有两种键盘输入模式。编辑模式命令模式编辑模式,允许你往单元中键入代码或文本, 这时的单元框线是绿色/蓝色的被选中状态;命令模式,键盘输入运行程序命令,这时的单元框线是灰色。未选中的单元没有线框。命令模式下,按快捷键‘Z’能恢复最近一个被删除的单元格

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
# 命令模式 (按键 Esc 开启):

Shift-Enter : 运行本单元,选中下个单元 
 Ctrl-Enter : 运行本单元 
 Alt-Enter : 运行本单元,在其下插入新单元 
 Enter : 转入编辑模式 
 Y : 单元转入代码状态 
 M :单元转入markdown状态 
 R : 单元转入raw状态 
 1 : 设定 1 级标题 
 2 : 设定 2 级标题 
 3 : 设定 3 级标题 
 4 : 设定 4 级标题 
 5 : 设定 5 级标题 
 6 : 设定 6 级标题 
 Up : 选中上方单元 
 K : 选中上方单元 
 Down : 选中下方单元 
 J : 选中下方单元 
 Shift-K : 扩大选中上方单元 
 Shift-J : 扩大选中下方单元 
 A : 在上方插入新单元 
 B : 在下方插入新单元 
 X : 剪切选中的单元 
 C : 复制选中的单元 
 Shift-V : 粘贴到上方单元 
 V : 粘贴到下方单元 
 Z : 恢复删除的最后一个单元 # 此条常用
 D,D (按两次d): 删除选中的单元 
 Shift-M : 合并选中的单元 
 Ctrl-S : 文件存盘 
 S : 文件存盘 
 L : 转换行号 
 O : 转换输出 
 Shift-O : 转换输出滚动 
 Esc : 关闭页面 
 Q : 关闭页面 
 H : 显示快捷键帮助 
 I,I : 中断Notebook内核 
 0,0 : 重启Notebook内核 
 Shift : 忽略 
 Shift-Space : 向上滚动 
 Space : 向下滚动

# 编辑模式 ( Enter 键启动):

Tab : 代码补全或缩进 
 Shift-Tab : 提示 
 Crtl-/: 为一行或者多行添加/取消注释 
 Crtl-D: 删除选中行 
 Ctrl-] : 缩进 
 Ctrl-[ : 解除缩进 
 Ctrl-A : 全选 
 Ctrl-Z : 复原 
 Ctrl-Shift-Z : 再做 
 Ctrl-Y : 再做 
 Ctrl-Home : 跳到单元开头 
 Ctrl-Up : 跳到单元开头 
 Ctrl-End : 跳到单元末尾 
 Ctrl-Down : 跳到单元末尾 
 Ctrl-Left : 跳到左边一个字首 
 Ctrl-Right : 跳到右边一个字首 
 Ctrl-Backspace : 删除前面一个字 
 Ctrl-Delete : 删除后面一个字 
 Esc : 进入命令模式 
 Ctrl-M : 进入命令模式 
 Shift-Enter : 运行本单元,选中下一单元 
 Ctrl-Enter : 运行本单元 
 Alt-Enter : 运行本单元,在下面插入一单元 
 Ctrl-Shift– : 分割单元 
 Ctrl-Shift-Subtract : 分割单元 
 Ctrl-S : 文件存盘 
 Shift : 忽略 
 Up : 光标上移或转入上一单元 
 Down :光标下移或转入下一单元 

命令模式 (按键 Esc 开启):

需要安装ipykernel进行启动

1
2
3
conda install ipykernal
python -m ipykernel install --name your_env_name
python -m ipykernel install --user --name your_env_name --display-name your_env_name

快速计算运行时间

1
2
3
4
5
# 计算一些函数或过程运行时间,以此来衡量代码的效率
`%time`:在行模式下,代码运行一次所花费的时间
`%%time`:在单元模式下,代码运行一次所花费的时间
`%timeit`:在行模式下,执行代码块若干次,取最佳结果
`%%timeit`:在单元模式下,执行代码块若干次,取最佳结果
1
2
3
4
# 查看当前变量
`%who_ls`:查看当前定义了多少变量
# 也可以指定变量类型查看
`%who_ls str`:查看当前有哪些变量是字符串

还可以用于加载外部文件

1
2
3
4
5
# `%load` 可以直接加载外部文件,比如下面的命令可以直接在notebook中打开对应文件
%load test.py
  
# 直接打开在线文档也是可以的,比如打开Matplotlib官方文档中的示例代码
%load http://matplotlib.org/mpl_examples/pylab_examples/contour_demo.py

Python包导入的路径顺序

在虚拟环境中,导入包版本时,却是其他版本,常见如pytorch等。

  • sys.path
  • PYTHONPATH
  • site.py
  • cpython

python是从sys.path按顺序查找所需要的package的,可以通过命令

1
2
# 查看默认的库路径
python -m site

进行查看,输入

1
  python -m site -help

可以查看site.py的路径,修改USER_SITE的值为该虚拟环境的库的路径

也可以通过使用python -s执行脚本,-s会忽略用户下的site-package,即linux中位于./local下的site-package

??为何使用pip install后,tensorflow的安装路径在根目录?而使用conda install,才会更新到虚拟环境?以及成功install后却无法进行import的原因?

在虚拟环境下,通过使用

1
2
import sys
sys.path

路径查询后,发现对应的python环境即为对应的虚拟环境路径,因此需要找到对应的解决方案,即为何在使用pip进行安装时,总是安装在根目录或系统的python下,而不是在虚拟环境中。

1
  python -m pip install xxx

使用python -m时,可以发现该命令运行在当前的python版本路径之中,因此在此路径下

追加路径

通过设置环境变量PYTHONPATH时,路径会被添加到最前面。即通过

1
export PYTHONPATH=$(pwd)/src

的形式添加,而通过

1
2
3
import sys
sys.path
sys.path.append('/xx/xx')

的形式添加的路径,会被放到系统路径中的最后面

关于sys.path

sys.path 初始化的时候有两部分:os.environ[‘PYTHONPATH’] 和 默认的安装依赖的一些路径(例如 python 安装的根目录 和 pythonxx.zip)

Tqdm

Tqdm是 Python 进度条库,可以在 Python 长循环中添加一个进度提示信息。用户只需要封装任意的迭代器,是一个快速、扩展性强的进度条工具库。tqdm可用于所有可迭代对象,所以可以直接用在dataloader上,用法:tqdm(iterator),如下:

1
2
from tqdm import *
for data, target in tqdm(train_loader):

Ref: PyTorch 59.tqdm进度条

visdom

time

1
2
3
4
import time
  
start_time = time.time()
print("---- The calculate takes %s seconds --- ", %(time.time() - start_time ))

os

创建文件夹

1
2
3
4
5
6
# mkdir 只能创建一个目录,不能递归创建目录,例如创建 ./two/three 目录的时候,./two 目录必须存在,否则报错,另外需要注意的是,如果已经存在了目录,则创建目录也会失败
os.mkdir() 

# makedirs 可以递归创建目录,并且通过Flag `exist_ok`:如果已经存在怎么处理,默认是 False ,即:已经存在程序报错。当为 True 时,创建目录的时候如果已经存在就不报错
os.makedirs()

path库用于判断各种路径

1
2
# 判断路径是否为文件夹/目录,或是否已存在
os.path.isdir()

顺序读取文件

1
2
3
4
5
path = '/Users/apple/Desktop/OCR'
path_list = os.listdir(path)
path_list.remove('.DS_Store')
path_list.sort(key=lambda x:int(x.split('.')[0])) #使用lambda函数指定数字序列号,进行排序
print(path_list)

PATH相关,python中的相对路径中,上一级路径需要用”../image/test.jpg”, 当前文件夹路径即”./test.jpg”, 同”/test.jpg”

系统的需要学一遍的相关python库

scipy

1
2
3
  ## 加载mat格式文件
from scipy.io import loadmat
loadmat("data.mat")

shutil

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# copy() 方法的功能类似于 Unix 中的“cp”命令。这意味着如果目标是一个文件夹,那么它将在其中创建一个与源文件具有相同名称(基本名称)的新文件。此外,该方法会在复制源文件的内容后同步目标文件权限到源文件。
shutil.copy()


  
# 它将源内容复制到目标文件中。如果目标文件不可写入,那么复制操作将导致 IOError 异常。如果源文件和目标文件都相同,它将会返回 SameFileError。
shutil.copyfile(src_path, dst_path):


 
# 复制整个文件夹
shutil.copytree(files, little_sample_file)
  
# 它将源内容移动到目标文件中。如果目标文件不可写入,那么复制操作将导致 IOError 异常。如果源文件和目标文件都相同,它将会返回 SameFileError。
shutil.move(src_path, dst_path): 

random

1
2
3
4
5
6
7
8
9
10
11
12
## shuffle
import random
random.shuffle(list)

## generate a integer
random.randint(min_val, max_val)


# get a value from a list randomly
list1 = ['佛山', '南宁', '北海', '杭州', '南昌', '厦门', '温州']
a = random.choice(list1)

  • scikit-learn as sklearn
  • scikit-image as skimage:python下的进阶图像处理库
  • copy
  • os
  • json

pathlib

1
from pathlib import Path

pathlib库从python-3.4开始,到python3.6已经比较成熟。解决了基于os.path库时,不同操作系统下路径处理不同的问题。

记录部分常使用的命令

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
import Path from pathlib 
import PurePath from pathlib

flie_name = Path("/tmp/hervanta.jpg")
file_name.stem # hervanta
file_name.name # hervanta.jpg
file_name.suffix # .jpg
file_name.parent # /tmp

file_path = Path(("/tmp/pics"))
for img in file_path.iterdir() # 遍历文件夹
Path.is_dir() # 判断是否为目录
Path.is_file() # 判断是否为文件
Path.mkdir() # 创建目录
Path.rename()  # 重命名目录
Path.resolve()  #返回绝对路径
Path.exists()  #判断路径是否存在
Path.rglob()  #递归遍历所有子目录的文件

# 实际调用
path = Path(r'C:\Users\sam\Desktop')
txt_files_only_subdirs = path.glob('*/*.txt') # only subdir under currrent dir
txt_files_all_recursively = path.glob('**/*.txt') # including all the subdirs even a few level lower
txt_files_all_recursively = path.rglob('*.txt') # including the current dir

  
# 路径连接
PurePath(Folder_name, file_name) # 等价于 folder_name + '/' + file_name

folder_name = Path(folder_path)
file_to_open = folder_name / "file_name.txt" # 如果想在某个Path对象后添加内容,只要在代码里使用“/”操作符来连接后面的路径,等价于 folder_name + '/' + file_name

Reference