调试:python -m pdb err.py
以参数-m pdb
启动,输入命令l
来查看代码,输入命令n
可以单步执行代码,输入命令q
结束调试,命令p
查看变量,命令c
继续运行
脚本的开始处加入import pdb
,然后在可能出错的地方放一个pdb.set_trace()
,就可以设置一个断点
表 1. pdb 常用命令
命令 | 解释 |
---|---|
break 或 b 设置断点 | 设置断点 |
continue 或 c | 继续执行程序 |
list 或 l | 查看当前行的代码段 |
step 或 s | 进入函数 |
return 或 r | 执行代码直到从当前函数返回 |
exit 或 q | 中止并退出 |
next 或 n | 执行下一行 |
pp | 打印变量的值 |
help | 帮助 |
清除断点
cl 2 #删除第2个断点
查看断点信息
b
查看全部栈内变量
a
python中变量的命名规则:
- 类似__xx,以双下划线开头的实例变量名,就变成了一个私有变量(private),只有内部可以访问,外部不能访问;
- 类似__xx__,以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,它不是private变量,下面会介绍Python中的常见特殊变量;
- 类似_x,以单下划线开头的实例变量名,这样的变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,但是请把我视为私有变量,不要随意访问”。
- a(rgs) #打印当前函数的参数
- w(here) #打印堆栈信息
- d(own) #移至下层堆栈
- u(p) #移至上层堆栈
- j(ump) #跳转到指定行
- disable [bpnumber [bpnumber]] #失效断点
- enable[bpnumber [bpnumber]] #启用断点
- cl(ear) [filename:lineno | bpnumber [bpnumber]] #删除断点
- q(uit)/exit #中止调试并退出
遍历文件夹
import os
import os.path
rootdir = “d:\data” # 指明被遍历的文件夹
for parent,dirnames,filenames in os.walk(rootdir): #三个参数:分别返回1.父目录 2.所有文件夹名字(不含路径) 3.所有文件名字
for dirname in dirnames: #输出文件夹信息
print "parent is:" + parent
print "dirname is" + dirname
for filename in filenames: #输出文件信息
print "parent is": + parent
print "filename is:" + filename
print "the full name of the file is:" + os.path.join(parent,filename) #输出文件路径信息
1、os.path.exists(path) 判断一个目录是否存在
2、os.makedirs(path) 多层创建目录
3、os.mkdir(path) 创建目录
def mkdir(path):
# 引入模块
import os
# 去除首位空格
path=path.strip()
# 去除尾部 \ 符号
path=path.rstrip("\\")
# 判断路径是否存在
# 存在 True
# 不存在 False
isExists=os.path.exists(path)
# 判断结果
if not isExists:
# 如果不存在则创建目录
print path+' 创建成功'
# 创建目录操作函数
os.makedirs(path)
return True
else:
# 如果目录存在则不创建,并提示目录已存在
print path+' 目录已存在'
return False
# 定义要创建的目录
mkpath="d:\\qttc\\web\\"
# 调用函数
mkdir(mkpath)
字符串函数:
newstr = string.replace(old, new[, max])
.replace(old, new[, max])
split函数:
>>> print b
fuck the world>>> list1=b.split()#把空格过滤出去,剩下的组成一个list,也可以在split()的括号里传入一个参数
>>> print list1
['fuck', 'the', 'world']
join函数:
>>> list1
['fuck', 'the', 'world']
>>> delimiter=' '>>> line=delimiter.join(list1)
>>> print line
fuck the world
#!/usr/bin/python
这个东西写过脚本的人都知道,用来标明该脚本的执行器
类似的还有
#!/bin/bash 通过bash来执行
#!/usr/local/php/bin/php 通过php执行器来执行
# -*- coding: utf-8 -*-
这个是设置脚本的编码格式,不然非英文可能会出现乱码
匿名函数lambda
#lambda很好用,创建匿名函数很方便
g = lambda x,y : x+yg(
g(3,5)#返回8
匿名函数分为四部分,标识 lambda,分号 :,参数 x,y,操作 x+y
除了这个之外,还有函数map、filter一个进行映射,一个进行过滤
__name__=="__main__"
一个文件就是一个模块,在python中每个模块都有一个__name__属性,属性的值取决于如何使用该模块,一般有两种使用方式,直接在命令行运行,这个时候__name__值为__main__,当import使用的时候,__name__值就是当前模块的名称(不带扩展名),因此可以通过这个判断是否是直接在命令行运行程序,以便做一些脚本使用。
创建元组
复制代码代码如下:
tup1 = ('physics', 'chemistry', 1997, 2000);
tup2 = (1, 2, 3, 4, 5 );
tup3 = "a", "b", "c", "d";
创建空元组复制代码代码如下:
tup1 = ();
元组中只包含一个元素时,需要在元素后面添加逗号来消除歧义复制代码代码如下:
tup1 = (50,);
访问元组
元组可以使用下标索引来访问元组中的值,如下实例:复制代码代码如下:
#!/usr/bin/python
tup1 = ('physics', 'chemistry', 1997, 2000);
tup2 = (1, 2, 3, 4, 5, 6, 7 );print "tup1[0]: ", tup1[0]
print "tup2[1:5]: ", tup2[1:5]
#以上实例输出结果:
#tup1[0]: physics
#tup2[1:5]: [2, 3, 4, 5]元组中的元素不可以修改,不可以删除。因此不可以创建一个空的元组后,再给其中的元素赋值。但两个元组可以相加成一个元组,也可以删除整个元组
多行注释:三对双引号"""
Python调用Shell脚本,有两种方法:os.system(cmd)或os.popen(cmd),前者返回值是脚本的退出状态码,后者的返回值是脚本执行过程中的输出内容。
#监控整个流程时间
TIME_MONITOR_LIST = [0,0]
TIME_MONITOR_LIST[0] = int(time.time())
main()
TIME_MONITOR_LIST[1] = int(time.time())
print('%.4f min'%(float(TIME_MONITOR_LIST[1]-TIME_MONITOR_LIST[0])/60))
sys.path是python的搜索模块的路径集,是一个list.在python 环境下使用sys.path.append(path)添加相关的路径,但在退出python环境后自己添加的路径就会自动消失!
模块是对象,并且所有的模块都有一个内置属性 __name__。一个模块的 __name__ 的值取决于您如何应用模块。如果 import 一个模块,那么模块__name__ 的值通常为模块文件名,不带路径或者文件扩展名。但是您也可以像一个标准的程序样直接运行模块,在这 种情况下, __name__ 的值将是一个特别缺省"__main__"。
在cmd 中直接运行.py文件,则__name__的值是'__main__';
而在import 一个.py文件后,__name__的值就不是'__main__'了;
从而用if __name__ == '__main__'来判断是否是在直接运行该.py文件
import shutil
shutil -- High-level file operations 是一种高层次的文件操作工具
类似于高级API,而且主要强大之处在于其对文件的复制与删除操作更是比较支持好。
|
copyfile( src, dst) | 从源src复制到dst中去。当然前提是目标地址是具备可写权限。抛出的异常信息为IOException. 如果当前的dst已存在的话就会被覆盖掉 |
copymode( src, dst) | 只是会复制其权限其他的东西是不会被复制的 |
copystat( src, dst) | 复制权限、最后访问时间、最后修改时间 |
copy( src, dst) | 复制一个文件到一个文件或一个目录 |
copy2( src, dst) | 在copy上的基础上再复制文件最后访问时间与修改时间也复制过来了,类似于cp –p的东西 |
copy2( src, dst) | 如果两个位置的文件系统是一样的话相当于是rename操作,只是改名;如果是不在相同的文件系统的话就是做move操作 |
copytree(olddir,newdir,True/Flase) | 把olddir拷贝一份newdir,如果第3个参数是True,则复制目录时将保持文件夹下的符号连接,如果第3个参数是False,则将在复制的目录下生成物理副本来替代符号连接 |
常用python库的安装
sudo apt-get install python-numpy
sudo apt-get install Python-scipy
sudo apt-get install python-matplotlib
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # 创建一个名为python34的环境,指定Python版本是3.4(不用管是3.4.x,conda会为我们自动寻找3.4.x中的最新版本) condacreate--namepython34python=3.4
# 安装好后,使用activate激活某个环境 activatepython34# for Windows sourceactivatepython34# for Linux & Mac # 激活后,会发现terminal输入的地方多了python34的字样,实际上,此时系统做的事情就是把默认2.7环境从PATH中去除,再把3.4对应的命令加入PATH
# 此时,再次输入 python--version # 可以得到`Python 3.4.5 :: Anaconda 4.1.1 (64-bit)`,即系统已经切换到了3.4的环境
# 如果想返回默认的python 2.7环境,运行 deactivatepython34# for Windows sourcedeactivatepython34# for Linux & Mac
# 删除一个已有的环境 condaremove--namepython34--all |
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # 创建一个名为python34的环境,指定Python版本是3.4(不用管是3.4.x,conda会为我们自动寻找3.4.x中的最新版本) condacreate--namepython34python=3.4
# 安装好后,使用activate激活某个环境 activatepython34# for Windows sourceactivatepython34# for Linux & Mac # 激活后,会发现terminal输入的地方多了python34的字样,实际上,此时系统做的事情就是把默认2.7环境从PATH中去除,再把3.4对应的命令加入PATH
# 此时,再次输入 python--version # 可以得到`Python 3.4.5 :: Anaconda 4.1.1 (64-bit)`,即系统已经切换到了3.4的环境
# 如果想返回默认的python 2.7环境,运行 deactivatepython34# for Windows sourcedeactivatepython34# for Linux & Mac
# 删除一个已有的环境 condaremove--namepython34--all |
通过which conda
或conda --version
命令检查是否正确。假如安装的是Python 2.7对应的版本,运行python --version
或python -V
可以得到Python 2.7.12 :: Anaconda 4.1.1 (64-bit),也说明该发行版默认的环境是Python 2.7.
在命令中运行conda info -e
查看已安装的环境
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 创建一个名为python34的环境,指定Python版本是3.4(不用管是3.4.x,conda会为我们自动寻找3.4.x中的最新版本)
condacreate--namepython34python=3.4
# 安装好后,使用activate激活某个环境
activatepython34# for Windows
sourceactivatepython34# for Linux & Mac
# 激活后,会发现terminal输入的地方多了python34的字样,实际上,此时系统做的事情就是把默认2.7环境从PATH中去除,再把3.4对应的命令加入PATH
# 此时,再次输入
python--version
# 可以得到`Python 3.4.5 :: Anaconda 4.1.1 (64-bit)`,即系统已经切换到了3.4的环境
# 如果想返回默认的python 2.7环境,运行
deactivatepython34# for Windows
sourcedeactivatepython34# for Linux & Mac
# 删除一个已有的环境
condaremove--namepython34--all
python中的特殊变量:
__name__ 区分模块是被import还是被python直接执行。被import时该值是模块名,被python直接执行时是'__main__'
__file__ 当前文件的路径+文件名
__doc__ 模块、类、函数的第一段代码如果是字符串的话,使用__doc__访问该字符串
另外一种达到可变参数 (Variable Argument) 的方法:使用*args和**kwargs语法。其中,*args是可变的positional arguments列表,**kwargs是可变的keyword arguments列表。并且,*args必须位于**kwargs之前,因为positional arguments必须位于keyword arguments之前。
*args 用来将参数打包成tuple给函数体调用
**kwargs 打包关键字参数成dict给函数体调用
必须是(arg,*args,**kwargs)这个顺序,否则程序会报错。
函数包装器仅仅是改改函数的参数或者接口,不改变函数的主要功能。
当调用函数包装器时仅仅返回function object,真正的函数并没有执行。