Python目录和路径操作

1. 目录操作(os模块)
1.1 获取当前工作目录
In [1]: import os                                                               

In [2]: os.getcwd()          # get current working directory                                                           
Out[2]: '/home/ming/桌面/python'
1
2
3
4
1.2 切换工作目录
In [18]: os.chdir('../')                                                        

In [19]: os.getcwd()                                                            
Out[19]: '/home/ming/桌面'
1
2
3
4
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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'
1
2
3
4
5
6
7
8
9
10
11
12
    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
2
3
4
5
6
7
8
9
10
11
12
13
14
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,因为它已被删除
1
2
3
4
5
6
7
8
    b. 删除指定的空目录,且如果删除该目录后,父目录为空,则递归删除父目录

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

In [4]: os.listdir('.')                                                         
Out[4]: ['dirA']
1
2
3
4
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
1
2
3
4
5
6
7
8
9
10
11
12
13
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
2
3
4
5
6
7
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']
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

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
1
2
3
4
5
2.2 判断一个路径是否存在
In [18]: os.path.exists('d0/d11')                                               
Out[18]: True

In [19]: os.path.exists('d0/d11/d20')                                           
Out[19]: False
1
2
3
4
5
2.3 获取一个路径的完全路径
In [20]: os.path.abspath('d0')                                                  
Out[20]: '/home/ming/桌面/python/d0'
1
2
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'
1
2
3
4
5
6
7
8
9
10
11
2.5 连接路径
即使该路径实际上并不存在也OK!

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

In [26]: path                                                                   
Out[26]: 'aaa/bbb/ccc/file.txt'
1
2
3
4
2.6 分离文件名和扩展名
In [27]: os.path.splitext('aaa/bbb/ccc/ddd/eee/fff.txt')                        
Out[27]: ('aaa/bbb/ccc/ddd/eee/fff', '.txt')
1
2

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']
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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']
--------------------- 
版权声明:本文为CSDN博主「W.T.F.」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/fcku_88/article/details/84197095

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值