python基础-文件和目录

时间:2021-01-29 18:43:34
  1. 字符串小练习

>>> s="1a2a3a4a5a"

>>> s1=s.split('a')

>>>

>>> s1

['1', '2', '3', '4', '5', '']

>>> 'b'.join(s1)

'1b2b3b4b5b'

 

  1. 小复习:

>>> 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("")
...

 

 

 

  1. 查看环境变量换行符:

>>> os.sep

'\\'

>>> os.pathsep

';'

>>>

 

  1. 查看目录:

>>> os.system("dir")

 

>>> os.system("dir2")
'dir2' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
1

这个命令的强大之处,利用linux命令在windows下执行。

 

  1. 面试:要会linux命令,30个左右。

Eg:怎么查询动态日志

tail -f 

小技巧:被问到的命令不会,可以转移一下说自己忘记了,但是会其他的命令。表明自己不是一点都不懂。

awk列处理

sed行处理

shell    

测试人员经常用到shell命令,安装和维护测试环境时使用。

常用shell:sort,unique,vmstat,iostat,free

 

  1. 判断当前所在目录:

>>> os.getcwd()

'E:\\'

  1. 查询方法:

>>> dir(os)

>>> dir(os.path)

 

  1. 创建目录:

>>> 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("")

结果是都建立在了同一级。

 

 

 

  1. 创建多级目录:

>>> os.makedirs(r"e:\\1\2\3\4\5")

 

  1. 其他操作目录命令:

安装命令: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

 

  1. Remove删除一个文件

>>> import os

>>> os.remove("e:\\b.py")

  1. 改名字

>>> os.rename("e:\\b.txt","e:\\c.txt")

 

  1. 查看文件的操作时间:

>>> 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'

 

  1. 设定文件的访问时间和修改时间

os.utime(r'c:\gloryroadtest.txt',(1375448978,1369735977)) 

 

目录也适用: os.utime(r'c:\gloryroadtest',(1375448978,1369735977))

 

  1. 制造临时文件

#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()

 

  1. 获取系统环境变量

>>> os.environ

 

  1. 判断文件操作权限

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)

 

  1. 修改文件操作权限

import os
os.chmod(r'c:\gloryroadtest.txt', 777) 

在linux上才有效,设定文件权限为可读、可写、可执行。421

 

  1. 运行shell命令,并返回一个文件对象。然后通过操作文件的方法去操作这个文件对象。

>>> dirList = os.popen('dir d:\\test*.*')

>>> for i in dirList.readlines():

...     print i

...

 驱动器 D 中的卷是 DATA

 

 卷的序列号是 66BF-D3EA

 

 d:\ 的目录

 

  1. *** 重点:遍历目录下所有目录和文件

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

...

 

 

  1. 获取绝对路径

>>> import os

>>> os.path.abspath("b.txt")

'E:\\b.txt' #返回值是一个字符串

 

  1. 文件和目录分离

>>> 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

 

  1. 判断是否为绝对路径

#encoding=utf-8
import os
print os.path.isabs(r'd:\gloryroad\a.py')
print os.path.isabs(r'a.py') 

 

  1. 获取文件大小

import os
print os.path.getsize("d:\\gloryroad\\a.py")

print os.path.getsize("e:\\a.py")

 

 

 

统计目录的大小结果是不可信的。

统计文件是可用的。

 

  1. 拼接路径

import os
print os.path.join('c:\\aa', 'test', 'a.txt')

  1. 拆分驱动器和文件路径

#encoding=utf-8
import os
>>> print os.path.splitdrive("e:\\test1\\a.txt")

('e:', '\\test1\\a.txt')

 

  1. 查询操作时间

>>> 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

 

 

 

 

  1. 终止当前进程:sys.exit(0)
    sys.exit(1) 非正常退出 

 

 

  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)  *表示拆包

**表示拆字典

 

  1. 传参例子

# -*- 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()

 

  1. 标准输入

#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

 

 

  1. 系统一般会提供标准输入,标准输出,标准错误输出。
  2. 复制操作

>>> 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)查询