Python目录和路径操作

1. 目录操作(os模块)

1.1 获取当前工作目录

In [1]: import os                                                               

In [2]: os.getcwd()  		# get current working directory 
Out[2]: '/home/ming/桌面/python'

1.2 切换工作目录

In [18]: os.chdir('../')                                                        

In [19]: os.getcwd()                                                            
Out[19]: '/home/ming/桌面'

1.3 获取指定目录下所有文件和目录名的列表

In [3]: os.listdir('../DrClient/')                                              
Out[3]: 
['hostinfo.sh',
 '201630664345',
 'drcomauthsvr',
 'debug.log',
 'translator',
 'DrClientConfig',
 'DrClientLinux.rcc',
 'privillege.sh',
 'drcomauthsvr.drsc',
 'DrClientLinux',
 'drcomrulesvr.drsc',
 'change.sh',
 'test_upeate_request']

1.4 创建目录

    a. 创建指定的目录,但不会递归创建不存在的父目录

In [4]: os.mkdir('dirA/')                                                       

In [5]: os.listdir('.')                                                         
Out[5]: ['dirA']

In [6]: os.mkdir('dirB/dirC')    # error! dirB尚不存在 
---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
<ipython-input-6-a44e11a81805> in <module>
----> 1 os.mkdir('dirB/dirC')    # error! dirB尚不存在

FileNotFoundError: [Errno 2] No such file or directory: 'dirB/dirC'

    b. 创建指定的目录,如果父目录不存在,则递归创建父目录

In [7]: os.makedirs('dirB/dirC/dirD')                                           

In [8]: os.listdir('.')                                                         
Out[8]: ['dirA', 'dirB']

In [9]: os.walk('dirB')                                                         
Out[9]: <generator object walk at 0x7fa7510bb678>

In [10]: for cur_dir, sub_dir, files in os.walk('dirB'): 
    ...:     print('当前目录:', cur_dir, '子目录:', sub_dir, '文件:', files) 
    ...:                                                                        
当前目录: dirB 子目录: ['dirC'] 文件: []
当前目录: dirB/dirC 子目录: ['dirD'] 文件: []
当前目录: dirB/dirC/dirD 子目录: [] 文件: []

1.5 删除目录

    a. 删除指定的空目录不会递归删除空的父目录!

In [16]: os.rmdir('dirB/dirC/dirD')                                             

In [17]: for cur_dir, sub_dir, files in os.walk('dirB'):  
    ...:     print('当前目录:', cur_dir, '子目录:', sub_dir, '文件:', files) 
    ...:                                                                        
当前目录: dirB 子目录: ['dirC'] 文件: []
当前目录: dirB/dirC 子目录: [] 文件: []
# 没有dirD,因为它已被删除

    b. 删除指定的空目录,且如果删除该目录后,父目录为空,则递归删除父目录

In [3]: os.removedirs('dirB/dirC')                                              

In [4]: os.listdir('.')                                                         
Out[4]: ['dirA']

1.6 遍历目录

递归遍历给定路径下所有的文件和文件夹。
这个函数会返回一个生成器,每次调用该生成器会返回一个元组:(当前路径, 当前路径下所有的子目录, 当前路径下所有的文件)。不断递归深入,不断返回这样的元组,直到路径最深处!然后再按照同样的过程遍历另外的子文件夹!也就是说,它是按照深度优先的方式遍历给的路径的。

ming@ming-Aspire-E5-572G:~/桌面/python$ tree d0
d0
├── d10
│   ├── d100
│   │   └── file1000.txt
│   ├── file100.txt
│   └── file101.txt
├── d11
│   ├── file110.txt
│   └── file111.txt
└── file1.txt

3 directories, 6 files
In [7]: for cur_dir, sub_dirs, files in os.walk('d0/'): 
   ...:     print('当前目录:', cur_dir, '子目录:', sub_dirs, '文件:', files) 
   ...:                                                                         
当前目录: d0/ 子目录: ['d10', 'd11'] 文件: ['file1.txt']
当前目录: d0/d10 子目录: ['d100'] 文件: ['file101.txt', 'file100.txt']
当前目录: d0/d10/d100 子目录: [] 文件: ['file1000.txt']
当前目录: d0/d11 子目录: [] 文件: ['file111.txt', 'file110.txt']

1.7 修改目录名称

可能会引起目录的移动。

In [8]: os.listdir('.')                                                         
Out[8]: ['dirA', 'd0']

In [9]: os.rename('dirA', 'DIR_A')    		# dirA --> DIR_A 

In [10]: os.listdir('.')                                                        
Out[10]: ['DIR_A', 'd0']

In [11]: os.rename('d0/d10/d100', 'D100')    	# 会导致目录移动! 

In [12]: os.listdir('.')                                                        
Out[12]: ['DIR_A', 'D100', 'd0']

In [13]: for cur_dir, sub_dirs, files in os.walk('d0/'): 
    ...:     print('当前目录:', cur_dir, '子目录:', sub_dirs, '文件:', files)
    ...:  
    ...:                                                                        
当前目录: d0/ 子目录: ['d10', 'd11'] 文件: ['file1.txt']
当前目录: d0/d10 子目录: [] 文件: ['file101.txt', 'file100.txt']
当前目录: d0/d11 子目录: [] 文件: ['file111.txt', 'file110.txt']

In [14]: os.listdir('D100')                                                     
Out[14]: ['file1000.txt']

2. 路径操作(os.path模块)

2.1 判断一个路径是否为文件或目录

In [15]: os.path.isfile('D100/file1000.txt')                                    
Out[15]: True

In [16]: os.path.isdir('d0/d10')                                                
Out[16]: True

2.2 判断一个路径是否存在

In [18]: os.path.exists('d0/d11')                                               
Out[18]: True

In [19]: os.path.exists('d0/d11/d20')                                           
Out[19]: False

2.3 获取一个路径的完全路径

In [20]: os.path.abspath('d0')                                                  
Out[20]: '/home/ming/桌面/python/d0'

2.4 提取路径中的目录部分和文件名部分

即使该路径实际上并不存在也OK!

In [21]: os.path.dirname('d0/d10/file101.txt')                                  
Out[21]: 'd0/d10'

In [22]: os.path.basename('d0/d10/file101.txt')                                 
Out[22]: 'file101.txt'

In [23]: os.path.dirname('aaa/bbb/ccc/ddd/eee/fff.txt')                         
Out[23]: 'aaa/bbb/ccc/ddd/eee'

In [24]: os.path.basename('aaa/bbb/ccc/ddd/eee/fff.txt')                        
Out[24]: 'fff.txt'

2.5 连接路径

即使该路径实际上并不存在也OK!

In [25]: path = os.path.join('aaa/bbb/ccc', 'file.txt')                         

In [26]: path                                                                   
Out[26]: 'aaa/bbb/ccc/file.txt'

2.6 分离文件名和扩展名

In [27]: os.path.splitext('aaa/bbb/ccc/ddd/eee/fff.txt')                        
Out[27]: ('aaa/bbb/ccc/ddd/eee/fff', '.txt')

3. 复制和移动(shutil模块)

3.1 复制

In [28]: import shutil                                                          

# shutil.copy(srcfile, dstfile) : 复制srcfile文件,并命名为dstfile
In [29]: shutil.copy('d0/file1.txt', 'd0/file2.txt')                            
Out[29]: 'd0/file2.txt'

In [30]: os.listdir('d0/')                                                      
Out[30]: ['d10', 'file1.txt', 'd11', 'file2.txt']

# shutil.copy(srcfile, path) : 复制srcfile文件到path路径下
In [31]: shutil.copy('d0/file1.txt', '..')                                      
Out[31]: '../file1.txt'

In [36]: os.listdir('..')                                                       
Out[36]: ['file1.txt', 'DrClient', '.ipynb_checkpoints', 'python']

# shutil.copytree(srcDir, dstDir) : 递归地复制srcDir目录,并命名为dstDir;dstDir不能是已经存在的!
In [37]: shutil.copytree('d0/', 'D0')                                           
Out[37]: 'D0'

In [39]: for cur_dir, sub_dirs, files in os.walk('D0/'): 
    ...:     print('当前目录:', cur_dir, '子目录:', sub_dirs, '文件:', files)
    ...:  
    ...:                                                                        
当前目录: D0/ 子目录: ['d10', 'd11'] 文件: ['file1.txt', 'file2.txt']
当前目录: D0/d10 子目录: [] 文件: ['file101.txt', 'file100.txt']
当前目录: D0/d11 子目录: [] 文件: ['file111.txt', 'file110.txt']

3.2 移动

# shutil.move(srcfile, dstfile) : 移动srcfile文件并命名为dstfile,相当于文件重命名
In [40]: shutil.move('d0/file1.txt', 'd0/FILE1.txt')                            
Out[40]: 'd0/FILE1.txt'

In [41]: os.listdir('d0')                                                       
Out[41]: ['FILE1.txt', 'd10', 'd11', 'file2.txt']

# shutil.move(srcfile, path) : 移动srcfile文件到path路径下
In [43]: shutil.move('d0/file2.txt', '.')                                       
Out[43]: './file2.txt'

In [44]: os.listdir('.')                                                        
Out[44]: ['DIR_A', 'D100', 'd0', 'D0', 'file2.txt']

# shutil.move(srcDir, dstDir) : 移动srcDir目录(包括其子目录和文件)到dstDir目录下
In [45]: shutil.move('d0', 'D0')                                                
Out[45]: 'D0/d0'

In [46]: for cur_dir, sub_dirs, files in os.walk('D0/'): 
    ...:     print('当前目录:', cur_dir, '子目录:', sub_dirs, '文件:', files)
    ...:                                                                       
当前目录: D0/ 子目录: ['d10', 'd0', 'd11'] 文件: ['file1.txt', 'file2.txt']
当前目录: D0/d10 子目录: [] 文件: ['file101.txt', 'file100.txt']
当前目录: D0/d0 子目录: ['d10', 'd11'] 文件: ['FILE1.txt']
当前目录: D0/d0/d10 子目录: [] 文件: ['file101.txt', 'file100.txt']
当前目录: D0/d0/d11 子目录: [] 文件: ['file111.txt', 'file110.txt']
当前目录: D0/d11 子目录: [] 文件: ['file111.txt', 'file110.txt']

你可能感兴趣的:(Python)