os:
1 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
2 os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd
3 os.curdir 返回当前目录: ('.')
4 os.pardir 获取当前目录的父目录字符串名:('..')
5 os.makedirs('dirname1/dirname2') 可生成多层递归目录
6 os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
7 os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname
8 os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
9 os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
10 os.remove() 删除一个文件
11 os.rename("oldname","newname") 重命名文件/目录
12 os.stat('path/filename') 获取文件/目录信息
13 os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
14 os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
15 os.pathsep 输出用于分割文件路径的字符串
16 os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
17 os.system("bash command") 运行shell命令,直接显示
18 os.environ 获取系统环境变量
19 os.path.abspath(path) 返回path规范化的绝对路径
20 os.path.split(path) 将path分割成目录和文件名二元组返回
21 os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素
22 os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
23 os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
24 os.path.isabs(path) 如果path是绝对路径,返回True
25 os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False
26 os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False
27 os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
28 os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间
29 os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
1 import os
2
3 print(__file__)
4 print(os.path.dirname(__file__)) # 取python文件路径名、目录名
5 print(os.path.dirname(os.path.dirname(__file__))) # 返回上一级目录
6 print(os.path.basename(__file__)) # 取python文件文件名
7 # 输出:
8 C:/Users/w/PycharmProjects/python/hashlib/0718.py
9 C:/Users/w/PycharmProjects/python/hashlib
10 C:/Users/w/PycharmProjects/python
11 0718.py
1 # -*- coding: utf-8 -*-模块路径添加方法
2
3 import os
4 import sys
5 #from bin import s3
6
7 print(os.path.dirname(__file__))
8 print(os.path.basename(__file__))
9
10 p1 = os.path.dirname(__file__)
11 p2 = 'bin'
12 p = os.path.join(p1, p2)
13 print(p)
14
15 sys.path.append(p) # 相比于下面的添加路径方法,好处在于改了路径名,不需改代码
16 #sys.path.append(r'C:\Users\w\PycharmProjects\python\hashlib\bin')
17
18 for i in sys.path: # 默认根据列表中的路径找模块
19 print(i)
20 print('-------------------------')
21
22 import s3
23 s3.test()
24
25 输出:
26 C:/Users/w/PycharmProjects/python/hashlib
27 0718.py
28 C:/Users/w/PycharmProjects/python/hashlib\bin
29 C:\Users\w\PycharmProjects\python\hashlib
30 C:\Users\w\PycharmProjects
31 C:\Users\w\AppData\Local\Programs\Python\Python35\python35.zip
32 C:\Users\w\AppData\Local\Programs\Python\Python35\DLLs
33 C:\Users\w\AppData\Local\Programs\Python\Python35\lib
34 C:\Users\w\AppData\Local\Programs\Python\Python35
35 C:\Users\w\AppData\Local\Programs\Python\Python35\lib\site-packages
36 C:/Users/w/PycharmProjects/python/hashlib\bin
37 -------------------------
38 =======in s3========
目录遍历:
os.walk(top, topdown=True, onerror=None, followlinks=False)
可以得到一个三元tupple(dirpath, dirnames, filenames),
第一个为起始路径,第二个为起始路径下的文件夹,第三个是起始路径下的文件。
dirpath 是一个string,代表每一个基于top的目录路径,
dirnames 是一个list,包含了dirpath下所有子目录的名字。
filenames 是一个list,包含了非目录文件的名字。
这些名字不包含路径信息,如果需要得到基于top的全路径,需要使用os.path.join(dirpath, name).
例:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import os
a = '/home/yumiao/sp2p_web-20170413-01'
for dirpath,dirnames,filenames in os.walk('/home/yumiao/sp2p_web-20170413-01'):
for filename in filenames:
#遍历所有文件(绝对路径)
print dirpath+filename
for dir in dirnames:
#遍历所有目录
print dir
[root@centos6 yumiao]# tree -L 1 /data/apache-tomcat
/data/apache-tomcat
├── apache-tomcat-sp2p-web-1025
├── tomcat-cms-app-1038
├── tomcat-jenkins-2025
├── tomcat-jenkins-2026
└── tomcat-mobi_server-1029
for dirpath,dirnames,filenames in os.walk(rootdir):
# for filename in filenames:
# directory = dirpath.split(rootdir)
# print directory
#for file in filenames:
# print dirpath+file
#print dirnames
#print dirpath
print filenames
if count > 4:
break
count += 1
dirpath: 是字符串,是目录的路径
/data/apache-tomcat
/data/apache-tomcat/tomcat-jenkins-2026
/data/apache-tomcat/tomcat-jenkins-2026/logs
/data/apache-tomcat/tomcat-jenkins-2026/bin
/data/apache-tomcat/tomcat-jenkins-2026/webapps
/data/apache-tomcat/tomcat-jenkins-2026/webapps/ROOT
dirnames: 是一个列表,dirpath中(除了.和..)包含了所有子目录名字
['tomcat-jenkins-2026', 'tomcat-jenkins-2025', 'tomcat-cms-app-1038', 'tomcat-mobi_server-1029', 'apache-tomcat-sp2p-web-1025']
['logs', 'bin', 'webapps', 'work', 'lib', 'conf', 'temp']
[]
[]
['ROOT']
['images', 'jsbundles', 'help', 'executable', 'scripts', 'WEB-INF', 'css', 'META-INF']
filenames:是一个列表,包含了dirpath路径下所有非目录的文件名
[]
['NOTICE', 'RELEASE-NOTES', 'LICENSE', 'RUNNING.txt']
['catalina.2017-02-07.log', 'catalina.2017-02-13.log', 'catalina.2017-02-14.log', 'catalina.2017-02-12.log', 'access_log.2017-02-07.txt', 'access_log.2017-02-08.txt', 'host-manager.2017-02-07.log', 'catalina.2017-02-11.log', 'catalina.2017-02-09.log', 'catalina.2017-02-10.log', 'catalina.out', 'catalina.2017-02-08.log', 'manager.2017-02-07.log', 'localhost.2017-02-07.log']
['configtest.bat', 'startup.bat', 'version.bat', 'tool-wrapper.sh', 'version.sh', 'catalina-tasks.xml', 'bootstrap.jar', 'configtest.sh', 'digest.bat', 'tomcat-juli.jar', 'catalina.bat', 'tool-wrapper.bat', 'startup.sh', 'setclasspath.sh', 'catalina.sh', 'install.sh', 'setclasspath.bat', 'daemon.sh', 'shutdown.sh', 'commons-daemon-native.tar.gz', 'commons-daemon.jar', 'digest.sh', 'shutdown.bat', 'tomcat-native.tar.gz', 'run.sh']
['jenkins.war']
['LogFileOutputStream$2.class', 'MainDialog$1$1.class', 'MainDialog.class', 'dc-license.txt', 'winstone.jar', 'robots.txt', 'Main.class', 'LogFileOutputStream$1.class', 'JNLPMain.class', 'favicon.ico', 'ColorFormatter.class', 'LogFileOutputStream.class', 'index.jsp', 'Main$FileAndDescription.class', 'MainDialog$1.class']
walk(top, topdown=True, onerror=None, followlinks=False)
Directory tree generator.
For each directory in the directory tree rooted at top (including top
itself, but excluding '.' and '..'), yields a 3-tuple
dirpath, dirnames, filenames
dirpath is a string, the path to the directory. dirnames is a list of
the names of the subdirectories in dirpath (excluding '.' and '..').
filenames is a list of the names of the non-directory files in dirpath.
Note that the names in the lists are just names, with no path components.
To get a full path (which begins with top) to a file or directory in
dirpath, do os.path.join(dirpath, name).
os.system(在python脚本中执行shell命令)
Execute the command (a string) in a subshell.
eg:
a = os.system('echo "this is py"')
print a
注意:
filename = 'demo2'
path = './'
os.system('rm -rf '+path+filename+'/*') 【-rf 后面一定要留一个空格出来否则会报错】
判断路径或文件
os.path.join:join(a, *p)
Join two or more pathname components, inserting '/' as needed.If any component is an absolute path, all previous path components will be discarded.
An empty last part will result in a path that ends with a separator.
os.path.isabs(...) # 判断是否绝对路径Test whether a path is absolute
os.path.exists(...) # 判断是否真实存在 exists(path) Test whether a path exists. Returns False for broken symbolic links
os.path.isdir(...) # 判断是否是个目录 Return true if the pathname refers to an existing directory
os.path.isfile(...) # 判断是否是个文件 isfile(path) Test whether a path is a regular file
注意: 把两个路径合成一个时,不要直接拼字符串,而要通过 os.path.join(part1,part2) 函数,这样可以正确处理不同操作系统的路径分隔符。在Linux/Unix/Mac下,os.path.join()返回这样的字符串 part1/part2而Windows下会返回这样的字符串: part1\part2
路径名、文件名分隔
os.path.split(...) # 分隔目录和文件名/文件夹名 split(p) Split a pathname. Returns tuple "(head, tail)" where "tail" is everything after the final slash. Either part may be empty.
os.path.splitdrive(...) # 分隔盘符(windows系统) splitdrive(p) Split a pathname into drive and path. On Posix, drive is always empty.
os.path.splitext(...) # 分隔文件和扩展名splitext(p) Split the extension from a pathname. Extension is everything from the last dot to the end, ignoring leading dots. Returns "(root, ext)"; ext may be empty.
这些合并、拆分路径的函数并不要求目录和文件要真实存在,它们只对字符串进行操作。
工作目录及创建文件夹操作
os.getcwd() # 获取当前工作目录
os.chdir(...) # 改变工作目录 chdir(path)
os.listdir(...) # 列出目录下的文件 listdir(path)
os.mkdir(...) # 创建单个目录 mkdir(path [, mode=0777])#测试时好像不支持权限参数 注意:创建多级用 os.makedirs()
os.makedirs(...) # 创建多级目录 makedirs(path [, mode=0777]) mkdir recursive.
创建文件夹可能会出错,原因具体有:(1) path 已存在时(不管是文件还是文件夹) (2) 驱动器不存在 (3) 磁盘已满 (4) 磁盘是只读的或没有写权限
删除文件夹/文件
os.rmdir(...) # 删除空文件夹 注意:必须为空文件夹 如需删除文件夹及其下所有文件,需用 shutil
os.remove(...) # 删除单一文件
shutil.rmtree(...) # 删除文件夹及其下所有文件
tip1:清空指定文件夹下所有文件的方法
需要在执行某些代码前清空指定的文件夹,如果直接用os.remove(),可能出现因文件夹中文件被占用而无法删除,解决方法也很简单,先强制删除文件夹,再重新建同名文件夹即可
- import shutil
- shutil.rmtree('要清空的文件夹名')
- os.mkdir('要清空的文件夹名')
产生异常的可能原因: (1) 路径不存在 (2) 路径子目录中有文件或下级子目录(os.rmdir) (3) 没有操作权限或只读
tip2:把一个文件从一个文件夹移动到另一个文件夹,并同时重命名,用shutil:
shutil.move('原文件夹/原文件名','目标文件夹/目标文件名')
重命名文件夹/文件
可对某一文件或文件夹重命名 os.rename(oldfileName, newFilename)
注意:新文件的扩展名不能遗漏,理论上需要保持类型一致;但这也不失为改文件类型的一种方式(相当于直接改文件的扩展名)
shutil
复制、移动文件夹/文件 :(new不指定路径,默认放到家目录)
shutil.copyfile("old","new") # (不copy权限)复制文件,都只能是文件 copyfile(src, dst) 注意:不会保持源文件权限,如果存在new会强制覆盖!!!
shutil.copytree("old","new") # 复制文件夹,都只能是目录,且new必须不存在 Recursively copy a directory tree using copy2() 保持源文件信息
shutil.copy("old","new") # (copy权限)复制文件/文件夹,复制 old 为 new(new是文件,若不存在,即新建,存在则覆盖!),复制 old 为至 new 文件夹(文件夹已存在),相当于 cp src dst
shutil.move("old","new") # 移动文件/文件夹至 new 文件夹中 同Unix下的mv命令
shutil.copy2(src, dst) #只能复制文件,只保留stat信息 Copy data and all stat info ("cp -p src dst") The destination may be a directory
commands模块:
commands.getoutput('shell command') # 执行shell命令,返回结果(string类型),忽略返回值
commands.getstatusoutput('shell command') # 执行shell命令, 返回两个元素的元组tuple(status, result),status为int类型,result为string类型。返回结果包含标准输出和标准错误.
commands.getstatus('file') # 该函数已被python丢弃,不建议使用,它返回 ls -ld file 的结果(String)
sys模块
1 sys.argv 命令行参数List,第一个元素是程序本身路径
2 sys.exit(n) 退出程序,正常退出时exit(0)
3 sys.version 获取Python解释程序的版本信息
4 sys.maxint 最大的Int值
5 sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
6 sys.platform 返回操作系统平台名称
7 sys.stdout.write('please:')
8 val = sys.stdin.readline()[:-1]
sys.argv(http://www.cnblogs.com/aland-1415/p/6613449.html)
0426.py脚本如下:
import sys
a = sys.argv[0]
b = sys.argv[1]
c = sys.argv[1:]
print a
print b
print c
执行脚本:
/home/yumiao/0426.py 2 Obama vivo trump
输出:
/home/yumiao/0426.py
2
['2', 'Obama', 'vivo', 'trump']
hashlib模块
python3中的hashlib
1. md5加密
hash = hashlib.md5()
hash.update('admin'.encode('utf-8'))
print(hash.hexdigest())
21232f297a57a5a743894a0e4a801fc3
2. sha1加密
hash = hashlib.sha1()
hash.update('admin'.encode('utf-8'))
print(hash.hexdigest())
d033e22ae348aeb5660fc2140aec35850c4da997
3. sha256加密
hash = hashlib.sha256()
hash.update('admin'.encode('utf-8'))
print(hash.hexdigest())
8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
4. sha384加密
hash = hashlib.sha384()
hash.update('admin'.encode('utf-8'))
print(hash.hexdigest())
9ca694a90285c034432c9550421b7b9dbd5c0f4b6673f05f6dbce58052ba20e4248041956ee8c9a2ec9f10290cdc0782
5. sha512加密
hash = hashlib.sha512()
hash.update('admin'.encode('utf-8'))
print(hash.hexdigest())
c7ad44cbad762a5da0a452f9e854fdc1e0e7a52a38015f23f3eab1d80b931dd472634dfac71cd34ebc35d16ab7fb8a90c81f975113d6c7538dc69dd8de9077ec
6. ‘加盐’加密
以上加密算法虽然很厉害,但仍然存在缺陷,通过撞库可以反解。所以必要对加密算法中添加自定义key再来做加密。
1 ###### md5 加密 ############
hash = hashlib.md5('python'.encode('utf-8'))
hash.update('admin'.encode('utf-8'))
print(hash.hexdigest())
75b431c498b55557591f834af7856b9f
7. hmac加密
hmac内部对我们创建的key和内容进行处理后在加密
import hmac
h = hmac.new('python'.encode('utf-8'))
h.update('helloworld'.encode('utf-8'))
print(h.hexdigest())
b3b867248bb4cace835b59562c39fd55
json模块:
(json的loads,dumps方法)
1 import jsonjson:本质就是字符串(内容比较特殊,是列表、字典、元组)http请求响应内容是字符串,如果要让python处理,需用json的loads方法。
2
3 s = '{"desc":"invilad-citykey","status":1002}' # 这种形似列表或字典或元组的字符串(s是由单引号括起来的字符串),内部元素如果是字符串,必须要加双引号(单引号会报错,如果交给json处理)
4 l = '[11, 22, 33, 44]'
5 result = json.loads(s) # 将一个形似列表或字典或元组的字符串,转换成列表或字典(前提,字符串必须符合列表或字典或元组的的格式)
6 result2 = json.loads(l)
7 print(result, type(result))
8 print(result2, type(result2))
9
10 # 输出:
11 {'desc': 'invilad-citykey', 'status': 1002} <class 'dict'>
12 [11, 22, 33, 44] <class 'list'>
13
14 dic = {'first': 1, "second": 2}
15 user_list = ['peter', 'john']
16 m = json.dumps(dic)
17 n = json.dumps(user_list)
18 print(m, type(m))
19 print(n, type(n))
20 #输出
21 {"first": 1, "second": 2} <class 'str'>
22 ["peter", "john"] <class 'str'>
23
24 小结:
25 json.loads() # 将字符串-->python基本数据类型(内部必须是双引号,否则报错)
26 json.dumps() # 将python基本数据类型-->字符串
27
注意:元组在loads时会出错,元组在dumps时会变成列表。因为只有字典、列表是通用数据类型
json的load,dump:作用,转换之后写到文件中(不常用)
1 import jsonload、dump
2 a = '{"whisky": 666, "tom": 2333, "peter": "ok"}'
3
4 dic = {"whisky": 666, "tom": 2333, "peter": "ok"}
5 json.dump(a, open('db', 'a+'))
6
7 r = json.load(open('db', 'r'))
8 print(r, type(r))
9
10 # 输出:
11 {'tom': 2333, 'whisky': 666, 'peter': 'ok'} <class 'dict'>
pickle:
1 #处理复杂数据类型(函数等)的方法:pickle(只支持python,不支持Java(支持json))View Code
2 import pickle
3
4 def sayhi(name):
5 print('hello,', name)
6 info = {
7 'name': 'whitesky',
8 'age': 25,
9 'func': sayhi
10 }
11
12 f = open('test.txt', 'wb') #pickle序列化要带b
13 f.write(pickle.dumps(info)) #相当于 pickle._dump(info,f)
14
15
16 #pickle反序列化
17
18 f = open('test.txt', 'rb')
19 data = pickle.loads(f.read()) # 相当于 pickle.load(f)
20
21 print(data['func'])
22
23
24 f.close()
25
26
27 #注意:写程序序列化时要记住只dump一次,只load一次(py3中dump多次,再load时会出错,py2中正常),如果需要存储多个状态,就dump成多个文件