- 字符串小练习
>>> s="1a2a3a4a5a"
>>> s1=s.split('a')
>>>
>>> s1
['1', '2', '3', '4', '5', '']
>>> 'b'.join(s1)
'1b2b3b4b5b'
- 小复习:
>>> import os
>>> os.linesep #查询换行符
'\r\n'
>>> os.name
'nt'
练习:
>>> os.path.exists("e: \\test1")
True
>>> os.path.exists("e: \\test1xxx")
False
题目:判断一个文件是否存在,如果不存在,则创建这个文件,如果在,就把文件的内容做个输出
>>> if os.path.exists("e:\\b.py"):
... with open("e:\\b.py") as fp:
... print fp.read()
... else:
... with open("e:\\b.py",'w') as fp:
... fp.write("")
...
- 查看环境变量换行符:
>>> os.sep
'\\'
>>> os.pathsep
';'
>>>
- 查看目录:
>>> os.system("dir")
>>> os.system("dir2")
'dir2' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
1
这个命令的强大之处,利用linux命令在windows下执行。
- 面试:要会linux命令,30个左右。
Eg:怎么查询动态日志
tail -f
小技巧:被问到的命令不会,可以转移一下说自己忘记了,但是会其他的命令。表明自己不是一点都不懂。
awk列处理
sed行处理
shell
测试人员经常用到shell命令,安装和维护测试环境时使用。
常用shell:sort,unique,vmstat,iostat,free
- 判断当前所在目录:
>>> os.getcwd()
'E:\\'
- 查询方法:
>>> dir(os)
>>> dir(os.path)
- 创建目录:
>>> os.mkdir("test1")
练习:题目:创建一个10层深的目录,每个目录下面,创建一个和目录名一致的txt文件
算法:先创建一级目录,进入该目录,创建文件;再此目录下再次创建目录,进入,创建文件和目录……
# -*- coding: utf-8 -*- #
import os
os.chdir("e:\\test6") #先进入到一个目录,在这个下面创建
for i in range(1,11):
os.mkdir("gloryroad"+str(i))
os.chdir("gloryroad"+str(i)) #进入到新创建的目录
with open("gloryroad"+str(i)+".txt","w") as fp:
fp.write("")
也可以直接pass,不写入空
# -*- coding: utf-8 -*- #
import os
#os.chdir("e:\\test6")
for i in range(1,11):
os.mkdir("gloryroad"+str(i)) #用到str做类型强转,因为字符串和数字不能直接拼接
os.chdir("gloryroad"+str(i))
with open("gloryroad"+str(i)+".txt","w") as fp:
pass
直接用getcwd是不能进入到新建的以及目录中并且保持不变的。
# -*- coding: utf-8 -*- #
import os
#os.chdir("e:\\test6")
for i in range(1,11):
os.mkdir("gloryroad"+str(i))
os.getcwd()
with open("gloryroad"+str(i)+".txt","w") as fp:
fp.write("")
结果是都建立在了同一级。
- 创建多级目录:
>>> os.makedirs(r"e:\\1\2\3\4\5")
- 其他操作目录命令:
安装命令:os.system("pip list")
删除目录:>>> os.removedirs(r"e:\1\2\3\4\5") 有内容的没办法直接删
从后往前开始执行删除,4,5没有内容会删除,但如果3有内容会到此停止,不在往上继续删。
删除一个目录下所有内容:>>> shutil.rmtree("e:\\test1") 有内容也会直接删除,把根目录都直接删除了。
删除操作前要先看自己在哪个目录下才行。
判断目录下有哪些:
>>> os.listdir("e:")
判断是否是文件:
>>> os.path.isfile("e:\\b.py")
判断是否是目录:
>>> os.path.isdir("e:\\b.py")
路径拼接:从当前目录去到其他路径,而不是手动切换。
>>> os.path.join("e:\\","a.py")
'e:\\a.py'
练习:统计一个目录下的文件和目录的个数
# -*- coding: utf-8 -*- #
import os
os.chdir("e:\\test1")
file_num=0
dir_num=0
for i in os.listdir("e:\\test1"):
if os.path.isfile(i):
file_num+=1
if os.path.isdir(i):
dir_num+=1
print "file_num:%s" %file_num
print "dir_num:%s" %dir_num
老师的方法:
# -*- coding: utf-8 -*- #
import os
def count_file_and_dir_number(dir_path):
if not os.path.exists(dir_path):
return 0,0
os.chdir(dir_path)
file_num=0
dir_num=0
for i in os.listdir(dir_path):
if os.path.isfile(i):
file_num+=1
else:
dir_num+=1
return file_num,dir_num
file_num,dir_num=count_file_and_dir_number("e:\\test1")
print "file number:%s" %file_num
print "dir number:%s" %dir_num
- Remove删除一个文件
>>> import os
>>> os.remove("e:\\b.py")
- 改名字
>>> os.rename("e:\\b.txt","e:\\c.txt")
- 查看文件的操作时间:
>>> import time
>>> time.localtime(1501111)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=18, tm_hour=16, tm_min=58, tm_s
ec=31, tm_wday=6, tm_yday=18, tm_isdst=0)
>>> t1=time.localtime(123444)
>>> time.strftime("%Y-%m-%d",t1) 年月日
'1970-01-02'
>>> time.strftime("%Y-%m-%d %H-%M-%S",t1) 年月日时分秒
'1970-01-02 18-18-24'
- 设定文件的访问时间和修改时间
os.utime(r'c:\gloryroadtest.txt',(1375448978,1369735977))
目录也适用: os.utime(r'c:\gloryroadtest',(1375448978,1369735977))
- 制造临时文件
#encoding=utf-8
import os
file=os.tmpfile()
file.write("hi1\n")
file.write("hi2\n")
file.write("hi3\n")
file.seek(0)
for i in file:
print i
print file
file.close()
- 获取系统环境变量
>>> os.environ
- 判断文件操作权限
import os
print os.access(r'c:\gloryroadtest.txt', os.W_OK)
print os.access(r'c:\gloryroadtest.txt', os.R_OK)
print os.access(r'c:\gloryroadtest.txt', os.X_OK)
- 修改文件操作权限
import os
os.chmod(r'c:\gloryroadtest.txt', 777)
在linux上才有效,设定文件权限为可读、可写、可执行。421
- 运行shell命令,并返回一个文件对象。然后通过操作文件的方法去操作这个文件对象。
>>> dirList = os.popen('dir d:\\test*.*')
>>> for i in dirList.readlines():
... print i
...
驱动器 D 中的卷是 DATA
卷的序列号是 66BF-D3EA
d:\ 的目录
- *** 重点:遍历目录下所有目录和文件
import os
for root, dirs, files in os.walk("e:\\test1",topdown=False) :
print u"当前目录:",root #打印目录绝对路径
for name in files :
print u'文件名:',os.path.join(root,name) #打印文件绝对路径
for name in dirs :
print u'目录名:',name #打印目录绝对路径
False从最深往上开始遍历
import os
for root, dirs, files in os.walk("e:\\test1",topdown=True) :
print u"当前目录:",root #打印目录绝对路径
for name in files :
print u'文件名:',os.path.join(root,name) #打印文件绝对路径
for name in dirs :
print u'目录名:',name #打印目录绝对路径
True是从最浅往最深开始遍历
老师总结:
False#topdown =Fasle 表示遍历从下向上开始
#topdown =True 表示遍历从上向下开始
先把当前要遍历目录下的子目录从小到大排序,
然后从最小的目录开始遍历,如果是topdown =Fasle
则从下向上遍历,如果是topdown =True则
从上到下遍历。root:当前正在的遍历的目录名称
dirs:表示正在被遍历目录中的所有子目录,dirs是个list
files:表示正在被遍历目录中的所有文件,files是个list
同学的方法:
>>> for root,dirs,files in os.walk("e:\\test1",topdown=True) :
... print root,dirs,files
...
- 获取绝对路径
>>> import os
>>> os.path.abspath("b.txt")
'E:\\b.txt' #返回值是一个字符串
- 文件和目录分离
>>> os.path.split("e:\\test1\\a.txt")
('e:\\test1', 'a.txt')
也可以把文件名进行切割:
>>> os.path.splitext("a.txt")
('a', '.txt')
实质上还是对字符串在进行操作,对文件名本身是没有任何影响的。
也可以用下面的方法进行文件和目录的分离:
>>> os.path.dirname("e:\\test1\\a.txt")
'e:\\test1'
>>> os.path.basename("e:\\test1\\a.txt")
'a.txt'
>>> os.path.basename(r"e:\test1\a.txt")
'a.txt'
不写两个\\时就要在前面加r
- 判断是否为绝对路径
#encoding=utf-8
import os
print os.path.isabs(r'd:\gloryroad\a.py')
print os.path.isabs(r'a.py')
- 获取文件大小
import os
print os.path.getsize("d:\\gloryroad\\a.py")
print os.path.getsize("e:\\a.py")
统计目录的大小结果是不可信的。
统计文件是可用的。
- 拼接路径
import os
print os.path.join('c:\\aa', 'test', 'a.txt')
- 拆分驱动器和文件路径
#encoding=utf-8
import os
>>> print os.path.splitdrive("e:\\test1\\a.txt")
('e:', '\\test1\\a.txt')
- 查询操作时间
>>> os.path.getctime("e:\\b.py") 创建时间creat
1485680291.1242003
>>> os.path.getmtime("e:\\b.py") 最近修改时间modify
1503212560.4156132
>>> os.path.getatime("e:\\b.py") 最近访问时间access
1495725806.1386025
- 终止当前进程:sys.exit(0)
sys.exit(1) 非正常退出
- 参数传入
#encoding=utf-8
#encoding=utf-8
import sys
for i in sys.argv:
print i
if i =="--help":
print "gloyrorad system help info:xxxxx"
练习:累加
#encoding=utf-8
#encoding=utf-8
import sys
def sum(*arg):
result=0
for i in arg[1:]: 从1开始切片是为了找到1 2 3,排除程序名称
result+=int(i)
return result
print sum(*sys.argv) *表示拆包
**表示拆字典
- 传参例子
# -*- coding: utf-8 -*- #
import os
import sys
def readfile(filename):
'''Print a file to the standard output.'''
f = file(filename)
while True:
line = f.readline()
if len(line) == 0:
break
print line,
f.close()
#print "sys.argv[0]---------",sys.argv[0]
#print "sys.argv[1]---------",sys.argv[1]
#print "sys.argv[2]---------",sys.argv[2]
# Script starts from here
if len(sys.argv) < 2:
print 'No action specified.'
sys.exit()
if sys.argv[1].startswith('--'):
option = sys.argv[1][2:]
# fetch sys.argv[1] but without the first two characters
if option == 'version':
print 'Version 1.2'
elif option == 'help':
print '''"
This program prints files to the standard output.
Any number of files can be specified.
Options include:
--version : Prints the version number
--help : Display this help'''
else:
print 'Unknown option.'
sys.exit()
else:
for filename in sys.argv[1:]:
readfile(filename)
sys.exit()
- 标准输入
#encoding=utf-8
import sys
counter = 1
while True:
line = sys.stdin.readline()
if not line.strip(): 有回车时会终止循环输入
break
print "%s:%s" % (counter,line)
counter += 1
- 系统一般会提供标准输入,标准输出,标准错误输出。
- 复制操作
>>> import shutil
>>> shutil.copyfile("e:\\a.py","e:\\test1\\xx.txt")
>>> shutil.copytree("e:\\test1","e:\\test11")
>>> shutil.move("e:\\a.py","e://test1\\x.py")
shutil.rmtree("e:\\test5")
>>> dir(shutil)查询