在terminal或是power shell下,可以直接在命令行输入操作系统提供的各种命令,比如,cd , .. , ls , diff , mkdir ,等等。
如果要在python中执行这些命令,就需要用到python标准库中的os库。

>>> import os


>>> os.name # 得到操作系统的名字。'nt' .net 就是windows系统, 
'nt' 


# 如果得到 'posix' 就是*nix系统
>>> os.environ
{'VS110COMNTOOLS': 'C:\\Program Files (x86)\\Microsoft Visual Studio 11.0\\Common7\\Tools\\', 'LIB': 'C:\\Program Files\\Microsoft Visual Studio\\DF98\\IMSL\\LIB;C:\\Program Files\\Microsoft Visual Studio\\DF98\\LIB;C:\\Program Files\\Microsoft Visual Studio\\VC98\\LIB', 'INTEL_LICENSE_FILE': 'C:\\Program Files (x86)\\Common Files\\Intel\\Licenses', 'ICEMCFD_SYSDIR': 'win64_amd', 'PSMODULEPATH': 'C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\Modules\\'...}
# os.environ 返回环境变量,是一个dict。


# 要获取某个环境变量的值,可以使用getenv()函数。
>>> os.getenv('PATH')
'C:\\Python27\\;C:\\Python27\\Scripts;C:\\ProgramData\\Oracle\\Java\\javapath;C:\\Program Files\\Microsoft HPC Pack 2008 R2\\Bin\\;C:\\Program Files\\Microsoft Visual Studio\\Common\\Tools;C:\\Program Files\\Microsoft Visual Studio\\Common\\Msdev98\\BIN;C:\\Program Files (x86)\\Intel\\MPI-RT\\4.0.2.005\\em64t\\bin;C:\\Program Files (x86)\\Intel\\MPI-RT\\4.0.2.005\\ia32\\bin;C:\\Windows\\system32;C:\\Windows;C:\\Windows\\system32\\wbem;C:\\Program Files (x86)\\pythonxy\\swig;C:\\Program Files\\Java\\jdk1.6.0_45\\bin;C:\\MinGW\\bin;C:\\MinGw\\msys\\1.0\\bin;C:\\Program Files (x86)\\nodejs\\;C:\\HashiCorp\\Vagrant\\bin;C:\\Program Files (x86)\\Windows Kits\\8.1\\Windows Performance Toolkit\\;C:\\Program Files\\Microsoft SQL Server\\110\\Tools\\Binn\\;C:\\Program Files (x86)\\Microsoft SDKs\\TypeScript\\1.0\\;C:\\Program Files\\Microsoft SQL Server\\120\\Tools\\Binn\\;C:\\Windows\\System32;c:\\Program Files\\FDS\\FDS5\\bin;.;;.;'


# 查看当前目录的绝对路径
>>> os.path.abspath('.')
'C:\\Users\\Duke\\Desktop\\test'


# 在某个目录下新建目录


# 首先把新目录的完整路径表示出来
>>> os.path.join(os.path.abspath('.'), 'testdir')
'C:\\Users\\Duke\\Desktop\\test\\testdir'


# 然后创建一个目录
>>> os.mkdir('C:\\Users\\Duke\\Desktop\\test\\testdir')


# 删掉一个目录
>>> os.rmdir('C:\\Users\\Duke\\Desktop\\test\\testdir')


# 注意,将两个路径合成一个时,不要直接拼接字符串,而是要通过
# os.path.join()函数,这样可以正确处理不同操作系统的路径分隔符。


# 因为在windows下,os.path.join()返回这样的路径:
# part1\part2


# 而在linux unix mac os 下返回这样的字符串:
# part1/part2


# 同样道理,拆分路径时也不要直接拆分字符串,而是通过os.path.split()
# 函数,这样可以把一个路径拆分为两部分:
# 最后一部分总是最后级别的目录名或是文件名
>>> os.path.split('C:\\Users\\Duke\\Desktop\\test\\ttjd.txt')
('C:\\Users\\Duke\\Desktop\\test', 'ttjd.txt')


# os.path.splitext() 可以直接得到文件扩展名
>>> os.path.splitext('C:\\Users\\Duke\\Desktop\\test\\ttjd.txt')
('C:\\Users\\Duke\\Desktop\\test\\ttjd', '.txt')


# 这些合并,拆分文件路径的函数并不要求文件真实存在,它们仅仅是对字符串操作而已


# 假设当前路径下 os.path.abspath('.'),存在一个'ttjd.txt'文件


# 文件重命名
>>> os.rename('ttjd.txt', 'ttjd.py')


# 文件夹重命名
>>> os.rename('tst', 'py')
>>> os.rename('py', 'tst')


# 移动文件 将./test.py移动到了./py/test.py
>>> os.rename('test.py',os.path.join(os.path.abspath('.'),'py\\test.py'))


# 当前工作路径 getcwd()
>>> os.getcwd()
'C:\\Users\\Duke\\Desktop\\test'


# os.getcwd()函数 要与 os.curdir属性区分
>>> os.curdir
'.'


# 改变当前路径
>>> os.chdir('./py')
>>> os.getcwd()
'C:\\Users\\Duke\\Desktop\\test\\py'


# 删除文件
>>> os.remove('ttjd.py')


# 但是复制文件的函数在os库中并不存在,因为复制文件并不是操作系统提供的系统调用。
# 理论上, 可以通过文件读写进行文件复制,不过要写不少代码。


# 幸好有shutil库提供了copyfile(src,dst)函数,shutil库是os模块的补充。
>>> shutil.copyfile('C:\\Users\\Duke\\Desktop\\test\\ttjd.txt','C:\\Users\\Duke\\Desktop\\test\\tst\\ttd.txt')


# 最后看看用python列表推导式过滤文件。


# 列出当前目录下的所有子目录
>>> [x for x in os.listdir('.') if os.path.isdir(x)]
['tst']


# 列出当前目录下的所有文件
>>> [x for x in os.listdir('.') if os.path.isfile(x)]
['ttjd.txt']


# 列出当前目录下所有py文件
>>> [x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1] == '.py']

要注意的是os模块封装了操作系统的目录和文件操作,要注意这些函数有的在os模块中,有的在os.path模块中。

练习:编写一个search.py文件,能在当前目录以及当前目录的所有子目录下查找文件名包含指定字符串的文件,并打印出完整路径。
目录结构为:

-test
—-unit_test.log
—-py
——–test.py
——–test_os.py
—-logs
——–unit-test-result.txt

要求在命令行输入:$ python search.py test

import os
import sys

def main():
    target = sys.argv[1]
    dirpaths = [os.path.abspath('.')]
    result = []
    while dirpaths:

        path = dirpaths.pop()

        for x in os.listdir(path):
            os.chdir(path)
            # os.path.isfile() and os.path.isdir() need current work directory
            if os.path.isfile(x) and target in x:
               result.append(os.path.join(path,x))
            if os.path.isdir(x):
                dirpaths.append(os.path.join(path,x))
    return result

if __name__ == '__main__':
    for ele in main():
        print ele

或者

import os
import sys

def main():
    target = sys.argv[1]
    dirpaths = [os.path.abspath('.')]
    result = []
    while dirpaths:

        path = dirpaths.pop()

        for x in os.listdir(path):
            #os.chdir(path)
            # os.path.isfile() and os.path.isdir() need current work directory
            if os.path.isfile(os.path.join(path,x)) and target in x:
               result.append(os.path.join(path,x))
            if os.path.isdir(os.path.join(path,x)):
                dirpaths.append(os.path.join(path,x))
    return result

if __name__ == '__main__':
    for ele in main():
        print ele

结果为:
C:\Users\DP\Desktop\test\unit_test.log
C:\Users\DP\Desktop\test\py\test.py
C:\Users\DP\Desktop\test\py\test_os.py
C:\Users\DP\Desktop\test\py\logs\unit-test-result.txt