本文目录
在Windows开始菜单选择“命令提示符”,就进入到命令行模式,它的提示符类似C:\>
在命令行模式下敲命令python,就看到类似如下的一堆文本输出,然后就进入到Python交互模式,它的提示符是>>>
。
在Python交互式模式下,可以直接输入代码,然后执行,并立刻得到结果。
在命令行模式下,可以直接运行.py文件。
如何运行多个版本的python:把每个python.exe
改一下名字,比如python3, python2,然后在环境变量里都要添加进去,然后在cmd分别输入python3
或python2
就可以了。更简单的办法是py -2
启动python2.x,py -3
启动python3.x。ubuntu里是通过python2
和python3
分别运行两个版本的python。
文本编辑器用Sublime Text或Notepad++都行,但是绝对不能用Word和Windows自带的记事本。Word保存的不是纯文本文件,而记事本会自作聪明地在文件开始的地方加上几个特殊字符(UTF-8 BOM),结果会导致程序运行出现莫名其妙的错误。
用Python开发程序,完全可以一边在文本编辑器里写代码,一边开一个交互式命令窗口,在写代码的过程中,把部分代码粘到命令行去验证,事半功倍!
Python引用(import)文件夹下的py文件的方法
如何在某.py文件中调用其他.py内的函数
当前目录是指的你运行 .py 文件时 shell 的当前目录; import 进行搜索的时候并不会默认对当前路径进行搜索, 只会对运行的.py文件所在的目录进行搜索。如果想要import一个data/目录下的xx.py,需要先把这个目录添加到import的搜索路径下:
import sys
sys.path.append('data/')
import xx
import同样也有作用域,在函数func里面import的函数,对外
需要调用其他py文件时才用import
,否则在IDLE里直接按F5就能运行了。
import module_name
后可以查看模块在本地的位置:module_name.__file__
r’字符串’
表示字符串里的\不转义
空值用None
表示
在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件。
u’...’
表示以Unicode表示的字符串
Unicode是默认编码,从Unicode转换为其他编码使用encode
方法,从其他编码转换为Unicode则用decode
方法:
把u'xxx'
转换为UTF-8编码的’xxx’用encode('utf-8')
方法:u'ABC'.encode('utf-8')
显示’ABC’
, u'中文'.encode('utf-8')
显示'\xe4\xb8\xad\xe6\x96\x87'
。
反过来,把UTF-8编码表示的字符串'xxx'
转换为Unicode字符串的u'xxx'
用decode('utf-8')
方法:'abc'.decode('utf-8')
得到u’abc’
。 直接 '\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
还不能输出汉字,得到的是u'\u4e2d\u6587'
,需要再print
一下:
print ‘%s’ %
(这里可以是gbk什么的字符串) print u‘%s’ %
(这里也得是u’×’或者decode一下)
接收输入:raw_input(‘提示内容’)
,内容只能是str类型,如果要输出中文(Unicode)则需要进行一波encode。不加u’’
时是ascii码,无法表示中文会出乱码;加u’’
时raw_input
不能接收Unicode,直接报错,所以需要:u’中文’.encode(‘gbk’)
,注意到u’中文’
相当于’中文’.decode(‘utf-8’)
格式化字符串的格式是 ’balabala’ % (格式化参数表)
,如果想输出%
则用%%
转义来表示
对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的。
关于函数:
查看函数介绍 或者通过help(函数名)来查看帮助
把函数名赋给一个变量,就相当于给这个函数起了一个别名,a=abs
后就可以a(-2)
取绝对值了
定义函数:def 函数名(参数表):
下一行要缩进
没有return
语句,函数将返回None
。return None
可以简写为return
pass
语句可以用在函数体或者一般语句里,作为一个什么都不做的占位符。有些地方不可以放空,如if:
后面的语句,放空会报错,如果现在还没想好怎么写,可以先放个pass
可变参数
关键字参数:同可变参数链接
四种参数可以组合使用,在参数表中的顺序为:必选参数、默认参数、可变参数和关键字参数
调用函数报错:
TypeError:abs() takes exactly one argument (2 given) 该函数只有1个参数,但给出了2个。Python解释器会自动检查出参数个数不匹配错误
TypeError: bad operand type for abs(): ‘str’ 参数类型不对,不应是给出的str类型
高级特性之列表生成式
函数式编程:map和reduce
闭包
示例如下:
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum
我们在函数lazy_sum
中又定义了函数sum
,并且,内部函数sum
可以引用外部函数lazy_sum
的参数和局部变量,当lazy_sum
返回函数sum
时,相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”的程序结构拥有极大的威力。
匿名函数:lambda x: x * x
实际上就是:
def f(x):
return x * x
关键字lambda
表示匿名函数,冒号前面的x
表示函数参数。
错误处理:使用try...except
捕获错误还有一个巨大的好处,就是可以跨越多层调用,比如函数main()
调用foo()
,foo()
调用bar()
,结果bar()
出错了,这时,只要main()
捕获到了,就可以处理。也就是说,不需要在每个可能出错的地方去捕获错误,只要在合适的层次去捕获错误就可以了。这样一来,就大大减少了写try...except...finally
的麻烦。
程序文件在类和方法定义的后面一般有几句例程语句,如果写成
if __name__ == '__main__':
执行例程
则能使得文件作为库导入时不会执行例程。
模块及包的导入
得到当前工作目录,即当前Python脚本工作的目录路径:
os.getcwd()
改变工作目录:os.chdir("path")
返回指定目录下的所有文件和目录名:os.listdir()
删除目录:os.rmdir("dir")
#只能删除空目录
函数用来删除一个文件:os.remove("file")
删除多个目录:os.removedirs(r“c:\python”)
检验给出的路径是否是一个文件:os.path.isfile()
检验给出的路径是否是一个目录:os.path.isdir()
判断是否是绝对路径:os.path.isabs()
检验给出的路径是否真地存:os.path.exists()
返回一个路径的目录名和文件名:os.path.split()
例:os.path.split('/home/swaroop/byte/code/poem.txt')
结果:('/home/swaroop/byte/code', 'poem.txt')
分离扩展名:os.path.splitext()
获取路径名:os.path.dirname()
获取文件名:os.path.basename()
运行shell命令:os.system()
读取和设置环境变量:os.getenv()
与os.putenv()
给出当前平台使用的行终止符:os.linesep
Windows使用'\r\n'
,Linux使用'\n'
而Mac使用'\r'
指示你正在使用的平台:os.name
对于Windows,它是'nt'
,而对于Linux/Unix用户,它是'posix'
重命名:os.rename("oldname","newname")
#文件或目录都是使用这条命令
创建多级目录:os.makedirs(r“c:\python\test”)
创建单个目录:os.mkdir(“test”))
获取文件属性:os.stat(file)
修改文件权限与时间戳:os.chmod(file)
终止当前进程:os.exit()
获取文件大小:os.path.getsize(filename)
遍历文件夹下的所有文件:for filename in os.listdir(path):
os.system(cmd命令)
用于在python中执行cmd命令,但有的时候一些命令没有管理员权限便无法执行。解决方法是,用管理员权限打开一个cmd,输入命令python XXX.py
则此时XXX.py中的cmd(os.system(cmd)
)命令是以管理员权限运行的。
在调用shell命令传入参数的时候,如果命令过长,我们可能会用回车将其分行,在python的字符串中样做没有问题,但是shell的解析将会出错,相当于只运行了第一行。解决办法是在每一行末尾加入\
,表示连接下一行。在当用os.system
调用命令并传入参数的时候也是类似,需要在截成多行的命令的每一行末尾加入\\
(字符串中\
表示转义,\\
才是\
)
python文件和目录操作方法大全(含更改文件夹下所有文件名称的实例)
os.mknod("test.txt")
#创建空文件
fp = open("test.txt",w)
#直接打开一个文件,如果文件不存在则创建文件
关于open 模式:
w
:以写方式打开
a
:以追加模式打开 (从 EOF 开始, 必要时创建新文件)
r+
:以读写模式打开
w+
:以读写模式打开 (参见 w )
a+
:以读写模式打开 (参见 a )
rb
:以二进制读模式打开
wb
:以二进制写模式打开 (参见 w )
ab
:以二进制追加模式打开 (参见 a )
rb+
:以二进制读写模式打开 (参见 r+ )
wb+
:以二进制读写模式打开 (参见 w+ )
ab+
:以二进制读写模式打开 (参见 a+ )
fp.read([size])
#size
为读取的长度,以byte
为单位
fp.readline([size])
#读一行,如果定义了size
,有可能返回的只是一行的一部分
fp.readlines([size])
#把文件每一行作为一个list
的一个成员,并返回这个list
。其实它的内部是通过循环调用readline()
来实现的。如果提供size
参数,size
是表示读取内容的总长,也就是说可能只读到文件的一部分。readlines
之后,文件指针已经指到了文件的末尾,重复f.readlines()
后面的结果就是空的,所以需要用个变量保存其输出结果,后面才能调用
fp.readlines()[-1]
#取最后一行
len(fp.readlines())
#获取文件的行数
fp.write(str)
#把str写到文件中,write()并不会在str后加上一个换行符
fp.writelines(seq)
#把seq的内容全部写到文件中(多行一次性写入)。这个函数也只是忠实地写入,不会在每行后面加上任何东西。
fp.close()
#关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。 如果一个文件在关闭后还对其进行操作会产生ValueError
fp.flush()
#把缓冲区的内容写入硬盘
fp.fileno()
#返回一个长整型的”文件标签“
fp.isatty()
#文件是否是一个终端设备文件(unix系统中的)
fp.tell()
#返回文件操作标记的当前位置,以文件的开头为原点
fp.next()
#返回下一行,并将文件操作标记位移到下一行。把一个file用于for … in file这样的语句时,就是调用next()函数来实现遍历的。
fp.seek(offset[,whence])
#将文件打操作标记移到offset
的位置。这个offset
一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence
参数就不一定了,whence
可以为0
表示从头开始计算,1
表示以当前位置为原点计算。2
表示以文件末尾为原点进行计算。需要注意,如果文件以a
或a+
的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾。
fp.truncate([size])
#把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size
比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0
把文件补到相应的大小,也可能是以一些随机的内容加上去。
把数据保存到文件中:
with open('dictionary.txt','w') as f:
f.write(str(dictionary))
从文件读取数据:
with open('dictionary.txt','r') as f:
dictionary = f.read()
dictionary = eval(dictionary)
eval
函数将字符串str
当成有效的表达式来求值并返回计算结果,不然read
得到的只是str
类型。
十六进制文件应该是这样子的,刚好是ASCII
码的话就显示成字符,不是的话就显示成\xyy
,所以有的时候看着一会\x00
一会?@$
以为是乱码,其实不一定是乱码。
复制文件:
shutil.copyfile("oldfile","newfile")
#oldfile和newfile都只能是文件
shutil.copy("oldfile","newfile")
#oldfile只能是文件夹,newfile可以是文件,也可以是目标目录
复制文件夹:shutil.copytree("olddir","newdir")
#olddir和newdir都只能是目录,且newdir必须不存在
移动文件(目录):shutil.move("oldpos","newpos")
删除目录:shutil.rmtree("dir")
#空目录、有内容的目录都可以删
dir(class)
函数可以查看一个对象拥有的所有属性和方法
若for a, b in xx
可以运行,则a, b in xx
也可以运行,表示对生成器xx取一次值
hasattr(e,"code")
判断e
是否含有属性code
,以防直接访问时出错(当然也可以用try..catch
结构,二者是等效的)
zip()
函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同. 利用 * 号操作符,可以将元组解压为列表。
zip 方法在 Python 2 和 Python 3 中的不同:在 Python 3.x 中为了减少内存,zip()
返回的是一个对象。如需展示列表,需手动list()
转换. 实例如下:
a = [1,2,3] b = [4,5,6]
zipped = zip(a,b) #输出为 [(1, 4), (2, 5), (3, 6)]
zip(*zipped) #则还原为 [(1, 2, 3), (4, 5, 6)]
i = input(prompt)
用于接收用户输入,prompt为提示语,一般为str类型
int函数:将给定的字符串转成十进制数,如int(‘10000’, 2)
返回16
运算符重载
pip install package_name
安装库
pip freeze > requirements.txt
生成依赖文件,有了这个,到了新的环境之后无需再一个个库重新pip install
,只需执行pip install -r requirements.txt
,它就会自动安装上去。(如果需要生成在虚拟环境下的依赖关系,需要先进入虚拟环境)
添加源:可以在使用pip
的时候加上-i 网址
,也可以直接修改配置文件:
Linux下,修改 ~/.pip/pip.conf (没有就创建一个文件夹及文件。文件夹要加“.”,表示是隐藏文件夹);windows下,直接在user目录中创建一个pip目录,如:C:\Users\xx\pip,新建文件pip.ini。内容如下:
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host=mirrors.aliyun.com
pip安装旧版本的pytorch
Python的各种库介绍
第一种方式得到的好像是个向量,第二和第三种方式得到的都是矩阵
matlab访问矩阵的单个元素的写法的a(row,col)
,python里是a[row,col]
数学函数:np.sin(x)
x可以是向量或矩阵,其它类似。反三角函数是arctan, Matlab中是atan.
np.arange(n)
返回向量[0,1, … n-1]
指定矩阵元素的数据类型:z = np.array([1, 2], dtype=np.int64)
矩阵间加减乘除可以直接用±*/,无需.*./ ,也可以用np.add
, np.subtract
, np.multiply
, np.divide
,开方是np.sqrt
。计算矩阵内积使用A.dot(B)
,或np.dot(A,B)
。行向量*列向量=1个数(内积),列向量*行向量=一个矩阵(外积)
np.power函数:矩阵元素乘方,常用格式为np.power(matrix, n)
np.sum函数:求和
print(np.sum(x))
所有元素求和
print(np.sum(x, axis=0))
各列求和
print(np.sum(x, axis=1))
各行求和
np.mean函数:求平均值
np.mean(a)
矩阵或向量所有元素求均值
np.mean(a, axis=0)
每列求均值
np.mean(a, axis=1)
每行求均值
np.savetxt函数:保存矩阵内容
np.savetxt("abc.txt", mat1, fmt="%f", delimiter=",")
fmt指明保存为哪种数据格式,delimiter指明分隔符
mat2 = np.loadtxt("abc.txt",delimiter=",")
从文件中读取矩阵的内容
矩阵转置:使用T属性。A为矩阵,A的转置为A.T
np.empty_like(x)
函数:创建一个与x同维度的全0矩阵
np.tile函数:与matlab的repmat函数类似,复制多个小矩阵组成大矩阵
np.tile(v, (4, 1))
产生由4行1列个v矩阵形成的矩阵
np.repeat函数:也是复制,但跟tile不太一样,repeat是按元素复制,例如从[1,2,3]变成[1,1,1,2,2,2,3,3,3],tile是按矩阵复制,像堆积木那样
np.repeat(v, 4, dim=0)
把矩阵v在第0维复制4份
np.reshape函数:作用与matlab中的reshape相同,将矩阵掰成想要的样子(向量也可以)
np.reshape(v, (m,n))
把v掰成m行n列,若n=1,可以把行向量掰成列向量
np.linalg.inv(a)
求矩阵a的逆,但通常速度较慢,有的矩阵甚至没有逆
np.linalg.solve(A, B)
解方程组AX=B,通常不使用inv(A)*B
。python会使用多种方法求出方程组的解,如果无解则给出近似解
np.array(a)
把str, list等格式的数据转换成ndarray
np.argsort(a)
对矩阵进行排序,返回升序排序后的下标。axis关键字参数指定排序维度,缺省为-1。想要得到前n大的数只需要a[result[:n]]
即可
np.row_stack((a, b))
行堆叠,用于矩阵串联,ab应有相同列数,得到[a; b]
貌似np.hstack()
与np.row_stack()
的功能是一样的
np.column_stack((a, b))
列堆叠,用于矩阵串联,ab应有相同行数,得到[a, b]
貌似np.vstack()
与np.column_stack()
的功能是一样的
np.dstack((a, b))
两个矩阵在深度(也就是3维向量里的第0维度)上合并
np.stack
则是创建一个新的维度以供合并,例如两个[3,4]的矩阵合并,通过设置np.stack((a,b), axis=x)
的x的取值为0,1,2,分别会得到shape为[2,3,4]、[3,2,4]、[3,4,2]的矩阵
list的合并可以用+
来实现,类似ones或zeros的操作可以通过*
来实现,最后转换成ndarray时无需加方括号(加了会变成二维数组):
labels = np.array( [1] * 10 + [0] * 20)
用+
实现合并创建了新的对象,开销较大,一般用list.append()
在末尾添加,用list.insert(ind, data)
在任意位置添加(在开头添加则ind=0). extend()方法用于在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)。
np.transpose(x,(0,2,1))
对数组的维度顺序进行交换,如x.shape = [3,4,5],交换后为[3,5,4]
np.argmax(a)
返回a的最大值对应的下标(np.max(a)
只能返回最大值)
np.where(condition)
返回符合条件的数组元素值。多条件的写法:np.where(cond1) and np.where(cond2)
, 或写成np.where(cond1 & cond2)
,最简单的是(cond1) & (cond2)
,可以被np.sum
np.argwhere(condition)
返回符合条件的数组元素下标
nditer —— numpy.ndarray 多维数组的迭代
记array
是一个np.ndarray对象,则:
array.tolist()
可以把ndarray
转成list
# 将imageio.core.util.Image转换为numpy.ndarray
import imageio
img = imageio.imread(filename)
image = np.asarray(img)
# 将PIL.Image转为ndarray
from PIL import Image
img = Image.open(filename)
image = np.asarray(img)
matplotlib.pyplot (以下简称plt) :
基本命令与matlab无异。区别在于,plt进行plot之后不会立即显示出图像,在plt.show()
之后才显示,显示之后plt就被清空了,无法像matlab一样重复显示图像。
plt.plot(x, y)
画图,产生一个lines对象,但不显示出图像来。Tensor不能直接拿来画图,要通过Tensor.numpy()
转换成ndarray才能画图。颜色、线型的设置同matlab
plt.xlabel(‘balabala’)
plt.ylabel类似
plt.title(‘balabala’)
plt.legend([‘bala’, ‘laba’])
比matlab多了一对中括号
plt.subplot(m, n, p)
画m行n列个图,现在是第p个
plt.pyplot.hold()
与matlab的hold相似,hold(True)
是开,False
是关,不带参数是切换。但不被推荐使用,因为在python中只要你不show,前面的多个plot就相当于是开了hold。
plt.savefig(imgName)
# 保存图片
plt.savefig(imgName, bbox_inches = 'tight')
# 有时候保存下来的图片四周会有比较大的空白,加个参数去掉这些空白
用matplotlib绘制gif图:样例代码;详细剖析原理
random.sample(seq, k)
从序列seq(一般是个迭代器,如range(xx)
)中随机选取k个互不相同的数,适合用来生成随机整数序列
random.randrange方法:返回指定递增基数集合中的一个随机数,基数缺省值为1。
用法:
import random
random.randrange([start,] stop [,step])
处理xlsx文件
十分钟搞定pandas
pandas数据结构和基本操作
写入不需要索引号的数据到csv文件:
# 注意键值要用[]括起来
info = pd.DataFrame({'angle': ['{:.2f}'.format(3.1415)],
'scale': ['{:.2f}'.format(3.0)],
'x_bias': ['{:.2f}'.format(0.0)],
})
try:
df = pd.read_csv('logs/summary.csv')
# concat连接两个列标签相同的dataframe
df = pd.concat([df, info])
except: # had no infos, create an empty dataframe
df = info
# index=None参数表示写入时不带index,如果带上index在下次读取时可能会出现"多出一个UnName列“的现象
df.to_csv('logs/summary.csv', index=None)
创建一个空DataFrame,并逐行插入数据(原文链接):
#创建一个空的Dataframe
result =pd.DataFrame(columns=('idx','degree','weight','diameter'))
#将计算结果逐行插入result,注意变量要用[]括起来,同时ignore_index=True,否则会报错,ValueError: If using all scalar values, you must pass an index
for i in idx:
degree=
weight=
diameter=
result=result.append(pd.DataFrame({'idx':[i],'degree':[degree],'weight':[weight],'diameter':[diameter]}),ignore_index=True)
ValueError: If using all scalar values, you must pass an index.的解决方案
# 写入时不要表头
df.to_csv('logs/summary.csv', header=None)
pandas读取csv文件,有时候会发现数字前面的0没了,解决方案:
# 不使用DataFrame,指定dtype=object即可,其他用法同DataFrame
data1 = pd.read_excel(filename, dtype=object)`
参考链接
signal.convolve2d (待补充)
矩阵的广播:向量可以以某种规则与矩阵做运算(如相加)
3×2的矩阵在和1×2的向量v做相加时,向量v会自动扩充成np.tile(v,(3,1)) ,与矩阵同维度后再相加。
Notepad++设置用空格取代TAB键:设置(T) ⇒ 首选项… ⇒ 语言 ⇒ 标签设置(有的版本叫做制表符设置),勾选 “以空格取代”。以后输入Tab键的时候就会自动以所设置的4个空格代替。
skl.model_selection.KFold 将数据分成K份,用于K折交叉验证。返回的是一个对象,调用对象的spilt方法来实现分割
kf = skl.KFold(n_split=2) 设置分割份数,其他参数略
for train_index, test_index in kf.split(X): 循环一共是n_split次,每一轮循环中的train_index与test_index就是一种分割方式大小之比约为K-1: K,test_index之间不会重复
skl.model_selection.StratifiedKFold 与KFold类似,但更优秀,它不仅将数据分成K份,同时保证训练集和验证集的比例在每一份中基本相同。
kf = skl.StratifiedKFold(n_split=2) 设置分割份数,其他参数略
for train_index, test_index in kf.split(X, Y) X是数据,Y是标签,split将根据Y来区分训练集和验证集
详见地址:https://blog.csdn.net/langb2014/article/details/54798823
scipy.cluster.vq.kmeans(obs, k_or_guess, iter=20, thresh=1e-05, check_finite=True) 输入obs是数据矩阵,行代表数据数目,列代表特征维度; k_or_guess表示聚类数目;iter表示循环次数,最终返回损失最小的那一次的聚类中心; 输出有两个,第一个是聚类中心codebook,一个k×N矩阵,第二个是损失distortion,即聚类后各数据点到其聚类中心的距离的加和。只求质心不分类
scipy.cluster.vq(obs, code_book, check_finite=True) 根据聚类中心将所有数据进行分类。obs为数据,code_book则是kmeans产生的聚类中心。输出同样有两个:第一个是各个数据属于哪一类的label,第二个和kmeans的第二个输出是一样的,都是distortion
scipy.cluster.vq.whiten(obs) 对数据进行白化(漂白)。数据白化可以减少特征之间的相关性,同时使得特征具有相同的方差(协方差阵为1)。obs是输入数据,输出是一个同维度的被漂白后的矩阵
百度语音API的用法:
安装:pip install aip
python实现matlab中find函数的方法:
①idx = [idx for (idx, val) in enumerate(a) if val > 2] 再 vals = [val for (idx, vals) in enumerate(a) if val > 2]
②idx = np.where(a > 2) 则 a[idx] 即为所求
③a[a>2] 最简单
_符号与matlab中的~用法相同,用于不接收某个返回值
torch.nn.functional.relu6(input, inplace=False) → Tensor[source]
Applies the element-wise function (\text{ReLU6}(x) = \min(\max(0,x), 6)).
See ReLU6 for more details.
该库的一般使用方法是:
parser = argparse.ArgumentParser(description='xxxxx', formatter_class=argparse.ArgumentDefaultsHelpFormatter)
# 添加一个参数, 可以通过--data_path_source xxxx 或者-d xxxx来传入参数, type指定类型, 可以是int或str, default指定默认值, help写明在help这个.py文件或者传入参数格式不合法时, 会弹出的信息
parser.add_argument('--data_path_source', '-d', type=str, default='data/Office-31/webcam', help='Root of the source dataset (default: webcam in Office-31)')
# bool类型的参数比较特殊, 不是用type=bool来设定的, 而是用action属性来指定, 当action='store_true'时, 传入--mixup(后面不用带一个值)即使得该参数为真, 不传则使用默认值(因此default跟action必须是相反的, True就要搭配store_false)
parser.add_argument('--mixup', default=False, action='store_true', help='The indicator of whether use mix-up trick (default: no)')
# choices关键字可以限定输入的范围
parser.add_argument("--mode", type=str, default='edge', choices=['edge', 'negative'], help="Training mode for training, 'edge' or 'negative' (default: 'edge')")
# nargs='+'的设定可以通过python arg.py --nargs 1234 2345 3456 4567 的方式传入一个list
parser.add_argument('--nargs', nargs='+')
# argparse可以接收各种类型格式的数据,也包括json数据(使用时注意传入参数在原来的json数据两端要加个单引号):
parser.add_argument('-d', '--my-dict', type=json.loads)
args = parser.parse_args()
# 至此, args就可以被用到main.py中了. 通过args.mixup来获取从命令行传入的值
nargs=’+'类型的相关链接
h5py库入门讲解
h5py库简单操作
URL:Uniform Resource Locator,统一资源定位符,也就是我们常说的网址。互联网上的每个文件都有一个唯一的URL,它指出了文件的位置以及浏览器应该怎么处理它。URL由三部分组成:协议+所在主机IP地址+目录和文件名
静态网页:查看服务器里的东西
动态网页(现在多是动态):用户传参数给服务器(如用户名和密码),服务器给出对应的响应。传参数有两种方法:①GET方法:把请求的数据附在URL之后,以?分割URL和传输的数据,参数之间以&相连,如果数据是英文字母/数字则原样发送,如果是空格则以+代替,如果是中文或其他字符则直接对字符串进行加密。 ②POST方法:把提交的数据放在HTTP包的包体中,用户无法在网址上看到传送的数据。返回的Response对象直接print不能读出内容,需要print(xx.content)
Python爬虫开发与项目实战(电子书)
Python爬虫入门(3):Urllib库的基本使用
Windows 10 Linux子系统 (wsl)学习手记
Python3学习笔记(urllib模块的使用)
python3爬虫问题 POST data should be bytes or an iterable of bytes
,解决方法:data = urllib.parse.urlencode(values).encode(encoding='UTF8')
,即在后面加一段.encode(encoding=’UTF8’)
字符串连接如果用+
不行的话,就采用格式化字符串:str=”%s str2 %s” %(str1,str3)
Vim命令合集
详解:Python2中的urllib、urllib2与Python3中的urllib以及第三方模块requests
python3使用cookie
Python3爬虫实战:爬取大众点评网某地区所有酒店相关信息
Python3常见问题和解决方案(Python2 和 Python3的区别)[持续更新]
python 一个.py文件如何调用另一个.py文件中的类和函数
在浏览器上如何查看或更改页面编码模式
Python中的str与unicode处理方法
Python: 在Unicode和普通字符串之间转换
\u672c\u52a8\u753b\u300a\u8d85\u65f6
这种码是Unicode编码,python中可以直接显示Unicode编码(Unicode是16位的Utf-8是8位的,两者不一样):
s=u'\u9738\u738b\u522b\u59ec'
print (s)
s.encode('gbk')
s.encode('utf8')
print (s.encode('gbk').decode('gbk'))
print (s.encode('utf8').decode('utf8'))
最基本的爬法(爬下整页html代码):
import sys
import urllib.request
res=urllib.request.urlopen('https://baike.baidu.com/item/SDF-1/7849075')
htmlBytes=res.read()
print(htmlBytes.decode('utf-8'))
str转bytes叫encode,bytes转str叫decode,上面的代码就是将抓到的字节流给decode成unicode数组
#-*- coding:utf-8 -*-
import sys
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8') #改变标准输出的默认编码
r’hello’ 前面的r的意思是“原生(原始)字符串”,如 r’\t’ 等价于 \t
aaa="Hello world"
print(aaa)
unicodestring = u"Hello world"
print(unicodestring)
utf8string = unicodestring.encode("utf-8")
print(utf8string)
asciistring = unicodestring.encode("ascii")
print(asciistring)
isostring = unicodestring.encode("ISO-8859-1")
print(isostring)
utf16string = unicodestring.encode("utf-16")
print(utf16string)
Python的三种代码续行书写方法
# 第一种:三个单引号
print (''' 我是一个程序员
我刚开始学习python''')
# 也可以加上...表示连接,可加可不加
print ('''line1
... line2
... line3''')
# 第二种:三个双引号
print (""" 我是一个程序员
我刚开始学习python""")
# 第三种:\结尾
print ("我是一个程序员,\
我刚开始学python")
python的注释:单行#,多行’’’或””” 快捷操作见下图:
清屏:ctrl+L
python str与bytes之间的转换:
# bytes object
b= b"example"
# str object
s = "example"
# str to bytes
bytes(s, encoding = "utf8")
# bytes to str
str(b, encoding = "utf-8")
# an alternative method
# str to bytes
str.encode(s)
# bytes to str
bytes.decode(b)
Python 有办法将任意值转为字符串:将它传入repr()
或str()
函数。函数str()
用于将值转化为适于人阅读的形式,而repr()
转化为供解释器读取的形式。
两个字符串可以用+
实现相加。
将字符串a中的’bb’替换成’cc’: a.replace(’bb’,’cc’)
a.strip()
:把头和尾的空格去掉
a.lstrip()
:把左边的空格去掉
a.rstrip()
:把右边的空格去掉
a.replace('c1','c2')
:把字符串里的c1替换成c2。故可以用replace(' ','')
来去掉字符串里的所有空格
a.split(b)
:根据指定分隔符b对字符串a进行切片,如果参数num 有指定值,则仅分隔 num 个子字符串。split支持正则表达式。
a.join(b)
:根据指定分隔符a把包含多个字符串的列表b连接成一个字符串
删除字符串中的连续空格只保留一个:不区分tab的话,
这样就行了: ' '.join(s.split())
1.使用re.compile
re模块中包含一个重要函数是compile(pattern [, flags])
,该函数根据包含的正则表达式的字符串创建模式对象。可以实现更有效率的匹配。在直接使用字符串表示的正则表达式进行search,match和findall操作时,python会将字符串转换为正则表达式对象。而使用compile完成一次转换之后,在每次使用模式的时候就不用重复转换。当然,使用re.compile()函数进行转换后,re.search(pattern, string)的调用方式就转换为 pattern.search(string)
的调用方式。findall依然可用:search_result = re.findall(pattern, message)
匹配中文:加个u表示Unicode编码即可 pattern = re.compile(u'歌|音乐')
其中,后一种调用方式中,pattern是用compile创建的模式对象。如下:
>>> import re
>>> some_text = 'a,b,,,,c d'
>>> reObj = re.compile('[, ]+')
>>> reObj.split(some_text)
['a', 'b', 'c', 'd']
2.不使用re.compile
在进行search,match等操作前不适用compile函数,会导致重复使用模式时,需要对模式进行重复的转换。降低匹配速度。而此种方法的调用方式,更为直观。如下:
>>> import re
>>> some_text = 'a,b,,,,c d'
>>> re.split('[, ]+',some_text)
['a', 'b', 'c', 'd']
格式化输出:
s = "%05d" % num # 将num转成字符串赋给s,如果num少于五位则在左边补0
正则表达式:(a和b是两个任意符号):
a.b贪婪搜索,以a开头b结尾,能拉多远拉多远
a.?b 懒惰搜索,以a开头b结尾,遇到第一个b就停下来
a|b a或b,用于实现类似switch的功能(不过python里面没有switch)
比如搜索一个标题,用正则表达式搜索到之后返回的是整段字符串:
如,表达式为纯原创我心中的NBA2014-2015赛季现役50大
但我们只想要标题文字,这个时候就要用到分组了:
分组的符号是(),使用之后中间的内容会被保存在一组中,如:
会得到两组分组,re_tit是第1组,标题内容是第二组。(.*?)
自己修改IDLE的面板并添加清屏按钮
Beautiful Soup 4.2.0 文档
为什么要使用Cookie呢?Cookie,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。比如说有些网站需要登录后才能访问某个页面,在登录之前,你想抓取某个页面内容是不允许的。那么我们可以利用Urllib2库保存我们登录的Cookie,然后再抓取其他页面就达到目的了。
Python 网络编程入门——用 Socket 做一个风花雪月服务器
记sock
为socket.socket()
函数返回的对象
sock.send()
与sock.sendall()
的区别:sock.send(data)
一次只发送n
个字节,不一定完全发完,其返回值的含义是成功发出的字节数,如果网络繁忙,这个数可能会小于data
的字节数;sock.sendall(data)
通过重复调用send()
来把所有的数据发送出去,该函数如果报错,无法得知已成功发送的字节长度。
sys.executable
可以查看python编译器的路径,用于辨认自己到底用的是哪一个编译器
换了个awrrpt.html的文件名也是如此。。。。
原来是由于\u之类的存在,导致了python进行转义,从而找不到目录下面对应的文件了。多加个\即可:
os.path.getsize(‘c:\user_weblogic.dmp’)
SyntaxError: (unicode error) ‘utf-8’ codec can’t decode byte 0xb4 in position 0: invalid start byte
基本知识:在python中默认的编码格式是 utf-8。所以怎么会报不能按 utf-8来解码嘞?一头雾水啊。
问题的解决:使用notepad++打开test.py发现文件存储的格式是ANSI
只要将保存文件的格式换成UTF-8就好了
使用notepad++打开test.py >> 菜单栏Encoding(编码)>> Convert to UTF-8(转化成utf-8)再运行test.py问题解决
csv.writer().writerow()保存的csv文件,打开时每行后都多一行空行:在with open里面增加一个newline=’’ 解释:参数newline是用来控制文本模式之下,一行的结束字符。可以是None,’’,\n,\r,\r\n等。
当在读取模式下,如果新行符为None,那么就作为通用换行符模式工作,意思就是说当遇到\n,\r或\r\n都可以作为换行标识,并且统一转换为\n作为文本输入的换行符。当设置为空’’时,也是通用换行符模式工作,但不作转换为\n,输入什么样的,就保持原样全输入。当设置为其它相应字符时,就会判断到相应的字符作为换行符,并保持原样输入到文本。
当在输出模式时,如果新行符为None,那么所有输出文本都是采用\n作为换行符。如果设置为’’或者\n时,不作任何的替换动作。如果是其它字符,会在字符后面添加\n作为换行符。
解决html文件乱码现象
html文件打开后出现乱码一般是因为编码格式不对
有些网站为了防止爬虫之类的非正常的访问,会验证请求信息中的UserAgent(它的信息包括硬件平台、系统软件、应用软件和用户个人偏好),如果UserAgent存在异常或者是不存在,那么这次请求将会被拒绝(如上错误信息所示)
解决方案:尝试在请求中加入UserAgent的信息
相关链接
解决python3 UnicodeEncodeError: ‘gbk’ codec can’t encode character ‘\xXX’ in position XX
Python 进阶必备:进程模块 multiprocessing
import multiprocessing as mp
q = mp.Queue()
# 这个q只能用于mp.Process(), 不能用于mp.Pool的apply跟apply_async,原因见下面链接
p = mp.Process(target=func, args=(q,))
# 如果又想用Pool又想用Queue,还有另一个东东可以用:
m= mp.Manager()
q = m.Queue()
p = mp.Process(target=func, args=(q,))
python multiprocess.Queue - RuntimeError: Queue objects should only be shared between processes through inheritance的解决方案
用进程池生成训练数据的时候,要使用pool.apply_async
而不是pool.apply()
,apply
相当于主进程一个一个送进去,一直在外面等,效率跟用一个进程是一样的,async
才能做到放进去然后继续往后走,继续for循环不断往里塞参数去生成数据(所以我也不是很懂apply
会适用于什么情况,感觉用apply
跟单进程没有差别呀)。而因为async
是放完就走,如果不加限制就很可能在数据还没生成完的时候主代码已经来到读取数据的地方,此时自然读不到数据,因此async
放好之后要来个pool.close()
跟pool.join()
,等进程们把数据生成完再往下读数据
原文链接
参考资料一
参考资料二
参考资料三
from multiprocessing.dummy import Pool
# 开8个 worker,没有参数时默认是 cpu 的核心数
pool = Pool(processes=8)
# 在线程中执行 urllib2.urlopen(url) 并返回执行结果,urls是一个list,每个元素是一个url
results2 = pool.map(urllib2.urlopen, urls)
subprocess库
call
函数:rc = subprocess.call(["ls","-l"]) # rc接收调用子进程后的returncode
也可以这样写:rc = subprocess.call("ls -l", shell=True)
,我们使用了shell=True
这个参数。这个时候,我们使用一整个字符串,而不是一个表来运行子进程。Python将先运行一个shell,再用这个shell来解释这整个字符串(原文链接)
driver.execute_script("window.open('');")
运行JS脚本新开一个窗口
模拟点击页面的空白处后进行按键(如Ctrl+End滚动到底部):
driver.find_element_by_tag_name('html').send_keys(Keys.CONTROL + Keys.END)
在input框中输入Keys.RETURN或Keys.ENTER相当于打回车,用于更新页面
填表单需要处理下拉框,如何选择下拉框的值呢?selenium提供了一个类,专门用于处理选择框:selenium.webdriver.support.select.Select
selenium.webdriver遇到的报错(故障)及原因:
Element could not be scrolled into view. : 有可能是因为浏览器窗口太小,看不到该元素了(跟我们直接看浏览器一样,窗口小有的东西是点不到的);二级下拉框如果没有先选中其上级,就不会显示出来,直接click就会报这个错
在页面上能看到的元素,在page_source里却看不到:可能是因为html文档里面还有,即多个页面,selenium一开始只能看到最外面的页面,在iframe标签里的就看不到了。需要用
driver.switch_to.frame(id或name)
切进frame里才能看到,看完切回原来的主页面使用driver.switch_to_default_content()
方法。
Flask中的数据库操作:https://www.cnblogs.com/RomanticLife/p/8372624.html
python与myspl的连接
使用pymysql库:import pymysql
连接数据库:mysql = pymysql.connect(host="localhost", user="root", passwd="xxxx", db="mysql", charset="utf8")
python数据库操作pymysql
Python简单爬虫导出CSV文件
python远程登录服务器(paramiko模块安装和使用
python读写文件,和设置文件的字符编码比如utf-8
python连接远程主机
关于CSV文件的读写问题(特别是有双引号和逗号的情况)
图书馆借阅系统数据库设计
Python2 --> Python3
为了提高稳定性,如果有时会在Python2环境下工作的话,不要直接替换掉原Imoprt语句,而是采用如下形式:
try:
# python3 的import 语句
except:
# python2 的import 语句
python3之后urllib2和urllib合并成urllib了。
urllib2.urlopen()
变成了urllib.request.urlopen()
urllib2.Request()
变成了urllib.request.Request()
urllib2.HTTPCookieProcessor
变成了urllib.request.HTTPCookieProcessor
urllib.urlencode
变成了urllib.parse.urlencode
cookielib
变成了http.cookiejar
urllib2.opener()
变成了urllib.request.build_opener
StringIO
和cStringIO
被io.StringIO
和io.BytesIO
替代:
from cStringIO import StringIO
--> from io import StringIO
*
操作符还可以是一元操作符,对list或tuple类型的变量*
一下,可以将该变量按元素拆分,如:b=[1,2,3],print(b)
输出[1 2 3],而print(*b)
则输出1 2 3
该操作一般用于函数,如函数cc定义为cc(a,b,c)
,则可以通过cc(*b)
的方式来调用
Python的一些需要容易引发出错的特性:
Python中对象的赋值都是进行对象引用(内存地址)传递,修改了被赋值的对象相当于是修改了原对象。这称为浅拷贝。深拷贝就是新创建一个对象,修改时不会影响原对象的内容。可以使用copy.deepcopy()进行深拷贝。
如果pip3 install 库名
等了很长时间都没安装成,可以尝试手动下载:
https://pypi.python.org/pypi ,下载到的一般是whl文件。whl格式本质上是一个压缩包,里面包含了py文件,以及经过编译的pyd文件。使得可以在不具备编译环境的情况下,选择合适自己的python环境进行安装。
安装下载好的库:pip3 install 库文件名.whl
如果下载了对应版本的库,pip install
时仍然提示不支持当前平台(not a supported wheel on this platform),可以先看看本地的pip支持哪些类型的库:在cmd中进入python
,输入import pip; print(pip.pep425tags.get_supported())
,便可以获取到pip支持的文件名还有版本。把下载下来的库改一下名字,改成符合要求的文件名,就可以下载啦~不过也请注意库的依赖哦。
python字符串格式化方法 format函数的使用(可代替原来的%方式)
functools库
partial
函数的功能:固定函数参数,返回一个新的函数。当函数参数太多,需要固定某些参数时,可以使用partial
创建一个新的函数。如funcb = partial(funca, y=2)
,funcb相当于funca中固定了y=2的版本。参考自这篇文章