目录
0、英文缩写
args=argument string 字符串参数
argc =argument count 参数的个数
argv =argument value 参数的值
os=Operating System 操作系统
GPU=Graphic Processing Unit 图形处理器 显卡的“大脑”
1、argparse模块
argparse模块是 argparse 是python自带的命令行参数解析包(模块),可以用来方便地读取命令行参数。 argparse 将弄清如何从 sys.argv 解析出那些参数。
使用步骤:
import argparse
- 导入argparse模块,并创建解释器
- 添加所需参数
- 解析参数
1-创建解析器
创建一个 ArgumentParser 对象:
2-添加参数
通过调用 add_argument() 方法给 ArgumentParser对象添加程序所需的参数信息
参数说明:
name or flags - 一个命名或者一个选项字符串的列表,例如 foo 或 -f, --foo。
action - 当参数在命令行中出现时使用的动作基本类型。
nargs - 命令行参数应当消耗的数目。
const - 被一些 action 和 nargs 选择所需求的常数。
default - 当参数未在命令行中出现时使用的值。
type - 命令行参数应当被转换成的类型。
choices - 可用的参数的容器。
required - 此命令行选项是否可省略 (仅选项可用)。
help - 一个此选项作用的简单描述。
metavar - 在使用方法消息中使用的参数值示例。
dest - 被添加到 parse_args() 所返回对象上的属性名。
表示同一个参数 ,这里要注意个问题,当
'-'
和'--'
同时出现的时候,系统默认后者为参数名,前者不是,但是在命令行输入的时候没有这个区分。
3-解析参数
通过 parse_args() 方法解析参数:
args - 要分析的字符串列表。默认值取自sys.argv。
4-命令行参数的输入如:
或者在run.sh中输入参数,在命令行输入bash run.sh调用即可。
2、logging 模块
logging 模块是 Python 内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;相比 print,具备如下优点:
1、通过设置不同的日志等级,在 release 版本中只输出重要信息,而不必显示大量的调试信息;
2、logging 则可以由开发者决定将信息输出到什么地方,以及怎么输出,输出什么,有限制要求;
①logging.basicConfig(**kwargs)
等级error > warnings > info > debug
等级是debug的话,error,warnings,info都会输出。
(一般自己调的时候level=logging.DEBUG,正式运行时level=logging.INFO)
3、读写操作:with open() as f:
f.write('hello world') #文件的写操作
with open('data.txt', 'w') as f:
相关参数:
file对象的属性:
需注意:
1、使用“w”模式。文件若存在,首先要清空,然后重新创建
2、使用“a”模式。把所有要写入文件的数据都追加到文件的末尾,即使你使用了seek()指向文件的其他地方,如果文件不存在,将自动被创建。
3、f.read([size]) :size未指定则返回整个文件,如果文件大小>2倍内存则有问题。f.read()读到文件尾时返回”“(空字串)
4、file.readline() 返回一行
5、file.readline([size]) 返回包含size行的列表,size 未指定则返回全部行
6、”for line in f: print line” #通过迭代器访问
7、f.write(“hello\n”) #如果要写入字符串以外的数据,先将他转换为字符串.
8、f.tell() 返回一个整数,表示当前文件指针的位置(就是到文件头的比特数).
9、f.seek(偏移量,[起始位置]) : 用来移动文件指针
偏移量 : 单位“比特”,可正可负
起始位置 : 0 -文件头, 默认值; 1 -当前位置; 2 -文件尾
10、f.close() 关闭文件
file.read([size]) 将文件数据作为字符串返回,可选参数size控制读取的字节数
file.readlines([size]) 返回文件中行内容的列表,size参数可选
file.write(str) 将字符串写入文件
file.writelines(strings) 将字符串序列写入文件
file.close() 关闭文件
file.closed 表示文件已经被关闭,否则为False
file.mode Access文件打开时使用的访问模式
file.encoding 文件所使用的编码
file.name 文件名
file.newlines 未读取到行分隔符时为None,只有一种行分隔符时为一个字符串,当文件有多种类型的行结束符时,则为一个包含所有当前所遇到的行结束的列表
file.softspace 为0表示在输出一数据后,要加上一个空格符,1表示不加。这个属性一般程序员用不着,由程序内部使用
小提示
Python引入了with语句来自动帮我们调用close()方法,同时也解决了异常问题。
调用read()会一次性读取文件的全部内容,如果文件很大,内存就爆了,所以可以反复调用read(size)方法,每次最多读取size个字节的内容。
调用readline()可以每次读取一行内容。
调用readlines()一次读取所有内容并按行返回list。
如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便:
With codecs.open()
有时候我们爬虫或者其他方式得到一些数据写入文件时会有编码不统一的问题,所以就一般都统一转换为unicode。此时写入open方式打开的文件就有问题了。例如
4、python使用json的格式
在python中对于json的格式要求非常非常的高,所以一定要很规则的格式才能顺利使用使用s = json.loads()这个方法。
json.load()函数是用来读取文件类型,json.load(f)之后,返回的对象是python的字典对象。
用json.load()函数读取文件句柄,可以直接读取到这个文件中的所有内容,并且读取的结果返回为python的dict对象。
5、Python 内置类型全解析
Python3 中,把 True 和 False 定义成关键字了,但它们的值还是 1 和 0,它们可以和数字相加。
1 Lists 列表型
一系列对象的有序集合。支持数字,字符串甚至可以包含列表,列表中的值称为元素(element),也可称为列表项(item)。
1-列表声明
创建列表时,使用中括号包裹一系列以逗号分割的值即可,也可使用 list() 函数.
2-列表索引、切片
切片索引包括起点,不包括终点。切片操作放在等号左侧,还可进行赋值操作,表示在切片的位置增加新的值。
3-列表拼接
列表的拼接可以使用 “+” 运算符、append 函数、extend 函数以及 insert 函数。
“+” 运算符连接列表以创建一个新列表。先连接并创建新的列表,在将新列表赋值给原变量。
append() 方法向列表的尾部添加一个新的元素
extend() 方法只接受一个列表作为参数,将该参数的每个元素都添加到原有的列表
insert() 方法将单个元素插入到列表中。它接受两个参数,第一个参数是列表中将被顶离原位的第一个元素的位置索引,第二个参数是要插入的对象。
append() 和 extend() 的区别
4-在列表中检索值
count() 方法返回了列表中某个特定值出现的次数。
in 运算符 用于判断某个值是否出现在列表中,in 运算符总是返回 True 或 False,速度快
index() 方法将查找某值在列表中的第一次出现,'new' 在列表中出现了两次,分别为 a_list[2] 和 a_list[4],但 index() 方法将只返回第一次出现的位置索引值。index() 方法可以通过第二个参数(以 0 为基点的)索引值来指定起点,通过第三个参数(以 0 基点的)索引来指定搜索终点。检索式包括起点,不包括终点。这和数组切片是类似的。
5-从列表中删除元素
可使用 del 语句从列表中删除某个特定元素。输入的是位置
使用 remove() 方法从列表中删除某个元素。remove() 方法接受一个 value 参数,并删除列表中该值的第一次出现。
pop() 方法将删除列表中最后的元素,并返回所删除的值。(有返回值),或者传给 pop() 方法一个位置索引值。它将删除该元素,将其后所有元素移位以“填补缝隙”,然后返回它删除的值。
2 Sets 集合型
集合 set 就像是一个装有不重复的、无序的对象的“袋子”。注意两个特性,一个是不重复,另一个是无序。
1-集合声明
使用一对花括号包裹元素,即可声明一个集合对象。多个元素,用逗号分开。
如果有两个集合,则可以执行像联合、交集以及集合求差等标准集合运算。
>>> a_set = {1}
>>> a_set
{1}
还可以列表为基础创建集合。从列表创建集合,使用 set() 函数。
>>> a_list = ['a', 'b', 'mpilgrim', True, False, 42]
>>> a_set = set(a_list)
>>> a_set
{'a', False, 'b', True, 'mpilgrim', 42}
>>> a_list
['a', 'b', 'mpilgrim', True, False, 42]
简单的集合可以包括任何数据类型的值。而且,正如之前所提到的,集合是无序的。该集合并不记得用于创建它的列表中元素的最初顺序。如果向集合中添加元素,它也不会记得添加的顺序。创建集合之后,初始的列表并不会发生变化。
如果没有指定任何值,可以创建一个空的集合。
>>> a_set = set()
>>> a_set
set()
>>> type(a_set)
<class 'set'>
>>> len(a_set)
0
打印出来的空集合表现形式看起来有点儿怪。也许,你期望看到一个 {} ,实际上该符号表示一个空的字典,而不是一个空的集合。稍后将讲述关于字典的内容。
你可以推想得到,不能使用两个花括号来创建空集合。该操作实际创建一个空字典。
>>> not_sure = {}
>>> type(not_sure)
<class 'dict'>
2-修改集合
有两种方法可向现有集合中添加值: add() 方法和 update() 方法。
add() 方法接受单个可以是任何数据类型的参数,并将该值添加到集合之中。
>>> a_set = {1, 2}
>>> a_set.add(4)
>>> a_set
{1, 2, 4}
>>> len(a_set)
3
集合是装 唯一值 的袋子。如果试图添加一个集合中已有的值,将不会发生任何事情。将不会引发一个错误;只是一条空操作。
>>> a_set.add(1)
>>> a_set
{1, 2, 4}
>>> len(a_set)
3
update() 方法仅接受一个集合作为参数,并将其所有成员添加到初始列表中。其行为方式就像是对参数集合中的每个成员调用 add() 方法。
>>> a_set = {1, 2, 3}
>>> a_set
{1, 2, 3}
>>> a_set.update({2, 4, 6})
>>> a_set
{1, 2, 3, 4, 6}
实际上,可以带任何数量的参数调用 update() 方法。如果调用时传递了两个集合, update() 将会被每个集合中的每个成员添加到初始的集合当中(丢弃重复值)。
>>> a_set.update({3, 6, 9}, {1, 2, 3, 5, 8, 13})
>>> a_set
{1, 2, 3, 4, 5, 6, 8, 9, 13}
update() 方法还可接受一些其它数据类型的对象作为参数,包括列表和元组。如果调用时传入列表或元组,update() 将会把其中的所有的元素添加到初始集合中。
>>> a_set.update([10, 20, 30])
>>> a_set
{1, 2, 3, 4, 5, 6, 8, 9, 10, 13, 20, 30}
>>> b = (40,50)
>>> b=(40,50)
>>> a_set.update(b)
>>> a_set
{1, 2, 3, 4, 5, 6, 8, 9, 10, 40, 13, 50, 20, 30}
3-从集合中删除元素
从集合中删除某个值,可以使用discard() 和 remove() ,这两种方法有细微的差异。
>>> a_set = {1, 3, 6, 10, 15, 21, 28, 36, 45}
>>> a_set
{1, 3, 36, 6, 10, 45, 15, 21, 28}
discard() 接受一个单值作为参数,并从集合中删除该值。
>>> a_set.discard(10)
>>> a_set
{1, 3, 36, 6, 45, 15, 21, 28}
如果针对一个集合中不存在的值调用 discard() 方法,它不进行任何操作。不产生错误,只是一条空指令。
>>> a_set.discard(10)
>>> a_set
{1, 3, 36, 6, 45, 15, 21, 28}
remove() 方法也接受一个单值作为参数,也从集合中将其删除。和 discard()的区别在于,如果该值不在集合中,remove() 方法引发一个 KeyError 异常。
>>> a_set.remove(21) ③
>>> a_set
{1, 3, 36, 6, 45, 15, 28}
>>> a_set.remove(21) ④
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 21
从集合中删除某个值,还有第三种方法pop() 。
pop() 方法从集合中删除某个值,并返回该值。然而,由于集合是无序的,并没有“最后一个”值的概念,因此无法控制删除的是哪一个值。它基本上是随机的。
>>> a_set = {1, 3, 6, 10, 15, 21, 28, 36, 45}
>>> a_set.pop() ①
1
>>> a_set.pop()
3
>>> a_set.pop()
36
>>> a_set
{6, 10, 45, 15, 21, 28}
还有一个删除集合中值的方法 clear() ,该方法用于删除集合中所有*的值,留下一个空集合。它等价于 a_set = set(),该语句创建一个新的空集合,并用之覆盖 a_set 变量的之前的值。
>>> a_set.clear() ②
>>> a_set
set()
>>> a_set.pop() ③
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'pop from an empty set'
从空集合中弹出某值将会引发 KeyError 异常。
4-常见集合操作
Python 的集合类型支持几种常见的运算。和数学中的“集合”概念一样,Python 中的集合对象同样支持并集、交集以及集合求差等标准的集合运算。
in 运算符用于检测某值是否是集合中的成员。
>>> a_set = {2, 4, 5, 9, 12, 21, 30, 51, 76, 127, 195}
>>> 30 in a_set
True
>>> 31 in a_set
False
union() 表示并集操作,该方法返回一个新集合,其中装着在两个集合中出现的元素。
>>> b_set = {1, 2, 3, 5, 6, 8, 9, 12, 15, 17, 18, 21}
>>> a_set.union(b_set)
{1, 2, 195, 4, 5, 6, 8, 12, 76, 15, 17, 18, 3, 21, 30, 51, 9, 127}
intersection() 表示交集操作,该方法返回一个新集合,其中装着同时在两个集合中出现的所有元素。
>>> a_set.intersection(b_set)
{9, 2, 12, 5, 21}
difference() 表示差集操作,该方法返回的新集合中,装着所有在 a_set 出现但未在 b_set 中的元素。
>>> a_set.difference(b_set)
{195, 4, 76, 51, 30, 127}
symmetric_difference() 方法表示交叉补集操作,该方法返回一个新集合,其中装着所有只在其中一个集合中出现的元素。其结果就是以上操作结果中,并集里去掉交集的部分
>>> a_set.symmetric_difference(b_set)
{1, 3, 4, 6, 8, 76, 15, 17, 18, 195, 127, 30, 51}
子集与父集操作,使用 issubset() 和 issuperset()方法。issubset() 用于判断该集合是否是括号内的参数的子集,issuperset() 用于判断该集合是否是括号内的参数的父集。
>>> a_set = {1, 2, 3}
>>> b_set = {1, 2, 3, 4}
>>> a_set.issubset(b_set) ①
True
>>> b_set.issuperset(a_set) ②
True
>>> a_set.add(5) ③
>>> a_set.issubset(b_set)
False
>>> b_set.issuperset(a_set)
False
3 字典型 Dictionaries
字典是键值对的无序集合。向字典添加一个键的同时,必须为该键增添一个值,之后可随时修改该值。
1-创建字典
创建字典非常简单。其语法与集合的类似,用花括号包裹元素,但应当指定键值对而不是值。
也可以使用 dict() 方法创建字典,参数如下例所示。
字典中为键值对,通过“键”可获取相应的“值”。
可以通过键获取值,但不能通过值获取键,否则会引发异常。
2-修改字典
字典没有预定义的大小限制。可以随时向字典中添加新的键值对,或者修改现有键所关联的值。继续前面的例子。
在字典中不允许有重复的键。对现有的键赋值将会覆盖旧值。
可随时添加新的键值对。该语法与修改现有值相同。字典中的对象是无需的,因此新增加的键值对不一定会在末尾。
字典键是区分大小写的。下面的例子中,user 与 User并不是同一个键,因此可以同时存在于字典中。
3-混合值字典
字典的值可以是任何数据类型,包括整数、布尔值、任何对象,甚至是其它的字典。而且就算在同一字典中,所有的值也无须是同一类型,可根据需要混合匹配。
字典的键要严格得多,可以是字符串、整数和其它一些类型,但必须是不可变类型。因为字典的值的位置是根据键计算出来的,因此键必须是不可变对象,这样才能确保字典的正确使用。
在同一字典中也可混合、匹配使用不同数据类型的键。字典可以嵌套
4-常见字典操作
此处列举一些常用的字典操作方法,其中很多与列表、集合是类似的
d.keys() # 遍历字典键
d.values() # 遍历字典值
d.items() # 遍历字典键值对
d.setdefault(key[, value]) # 为字典的某一项设置默认值
d.get(key, default) # 获取字典中的某个值
d.update(newd) # 合并字典,此方式效率较高
d.pop(key, [d]) # 删除字典中键值为key的项,返回键值为key的值,如果不存在,返回默认值d,否则抛出异常
d.popitem() # 随机删除某一项键值对
循环遍历字典中的键值对
5-布尔上下文环境中的字典
在 if 这样的 布尔类型上下文环境中使用字典,空字典为假值,所有其它字典为真值。
6、if-else的多种写法
a, b= 1, 2 将a和b两个变量中的最大值赋值给c
(1)常规写法
if a>b:
c = a
else:
c = b
(2)表达式
c = a if a>b else b
(3)二维列表
c = [b,a][a>b]
(4)逻辑赋值
c = (a>b and [a] or [b])[0]
3:首先a>b的取值为True或False,而在python中True的默认值为1False的默认值为0。
可得c = [b, a][1]或[b, a][0],即从列表中按下标索引的方式取值给c。
4:首先在Python中,对于逻辑运算符and 、or :
and: x and y 返回的结果是决定表达式结果的值。根据"短路"原则当x为真时决定表达式的真假由y的值决定,所有返回y;如果x为假则不进行y的判断,返回x。
or: x or y 当x为真直接返回x的值;当x为假、y为真时返回y的值;当全为假时返回y的值。
所以当在式子中:
当 a>b为真:a>b and [a] 即为真,不在进行or的判断,返回[a]
当 a>b为假:a>b and [a] 即为假,返回[b]
再对列表[a]或[b]进行按下标0进行取值,得到a或b。
7、Python常用模块之 os
1-os.path——文件及路径操作
os.path.abspath(path):输入相对路径,返回绝对路径
os.path.basename(path):返回路径最后的文件或目录名
os.path.dirname(path):与basename相反
os.path.split(path):分割路径,返回由其目录名和文件名组成的元组
os.path.splitext(path):分割路径,返回由其文件名和扩展名组成的元组
os.path.join(dirpath,filename):将路径与文件名拼接,根据操作系统自动使用相应的路径分隔符,Windows用“\”,Linux用“/”
os.path.exists(path):判断文件或目录是否存在,返回True或False
os.path.isdir(path):判断路径是不是文件夹,路径不存在同样返回False
os.path.isfile(path):判断路径是不是文件,路径不存在同样返回False
os.path.getsize(path):获取文件大小,单位字节
os.path.getctime(path):获取文件创建时间
os.path.getmtime(path):获取文件最后修改时间
os.path.getatime(path):获取文件最近访问时间
2- os.makedirs——递归创建文件目录
os.makedirs(name, mode=511, exist_ok=False) 方法用于递归创建多层(多级(有///))目录。
参数
-
path -- 需要递归创建的目录,可以是相对或者绝对路径。
-
mode -- 权限模式,默认的模式为 511 (八进制)。
-
exist_ok:是否在目录存在时触发异常。如果 exist_ok 为 False(默认值),则在目标目录已存在的情况下触发 FileExistsError 异常;如果 exist_ok 为 True,则在目标目录已存在的情况下不会触发 FileExistsError 异常。
举例:
8、python的各类函数
1-zip() 函数
用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
在 Python 3.x 中为了减少内存,zip() 返回的是一个对象。如需展示列表,需手动 list() 转换。
通过write()函数向文件中写入一行。
2-format()函数
一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能。
基本语法是通过 {} 和 : 来代替以前的 % 。
format 函数可以接受不限个参数,位置可以不按顺序。
3- torch.zeros()函数
返回一个形状为为size,类型为torch.dtype,里面的每一个值都是0的tensor
torch.zeros(*size,out=None,dtype=None,layout=torch.strided,device=None, requires_grad=False) → Tensor
9、Torchaudio
torchaudio 支持以 wav 和 mp3 格式加载声音文件。 我们称波形为原始音频信号.
TORCHAUDIO.BACKEND
torchaudio.backend模块提供音频文件 I/O 功能的实现,它们是torchaudio.info、torchaudio.load和torchaudio.save.
目前有四种可用的实现。
“sox_io” (Linux/macOS 上的默认设置)
“soundfile” (Windows 上的默认设置)
不要torchaudio.backend直接调用函数,请使用torchaudio.info, torchaudio.load, 和torchaudio.save适当的后端设置:torchaudio.set_audio_backend().
可以使用以下命令从另一个后端切换到sox_io后端;
10、python yaml用法详解
YAML是一种直观的能够被电脑识别的的数据序列化格式,容易被人类阅读,并且容易和脚本语言交互。YAML类似于XML,但是语法比XML简单得多,对于转化成数组或可以hash的数据时是很简单有效的。
一、PyYaml
1、load() :返回一个对象
我们先创建一个yml文件,config.yml:
在 YAML 5.1版本后,已经弃用了 yaml.load(file) 这个用法,因为这样很不安全。在5.1版本之后就修改了,使用 yaml.load() 方法需要指定Loader,通过默认加载器(FullLoader)禁止执行任意函数,这样 load() 函数也变得更加安全。解决上述报错将 yaml.load() 改为
即可。
11、有关cpu的小点
1- torch.set_num_threads(1)
可以设置 PyTorch
进行 CPU
多线程并行计算时所占用的线程数,用来限制 PyTorch
所占用的 CPU
数目;
2- torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
①device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
torch.device代表将torch.Tensor分配到的设备的对象。
cuda:0 是默认显卡
CPU和GPU是同级关系,CPU所在位置称为为主机端(host),而GPU并行计算,所在位置称为设备端(device)。
CUDA是是一种通用并行计算平台和编程模型,该架构使GPU能够解决复杂的计算问题。
kernel是CUDA中一个重要的概念。
②model .to(device)
这行代码的意思是将所有最开始读取数据时的tensor变量(训练的数据)copy一份到device所指定的GPU上去,之后的运算都在GPU上进行。
这句话需要写的次数等于需要保存GPU上的tensor变量的个数;一般情况下这些tensor变量都是最开始读数据时的tensor变量,后面衍生的变量自然也都在GPU上。