15. Python文件与目录操作¶
本文对Python文件和目录操作的问题做个总结。
15.1. 获取文件绝对目录¶
获取文件的绝对目录,请看下面的测试代码:
# path_test.py
import os
print "__file__:", __file__
#print "type(__file__):", type(__file__)
print "__name__:", __name__
print "os.path.dirname(__file__):", os.path.dirname(__file__)
print "os.path.abspath(__file__):", os.path.abspath(__file__)
print "os.path.dirname(os.path.abspath(__file__)):", os.path.dirname(os.path.abspath(__file__))
print "getcwd():", os.getcwd()
# path_test-2.py
import path_test
这两个文件,都放在/smbshare/目录下:
root@ubuntu:/smbshare# ls path_test*
path_test-2.py path_test.py path_test.pyc
然后在不同的目录,依次执行两个程序。首先在源文件所在目录/smbshare下执行:
root@ubuntu:/smbshare# python path_test.py
__file__: path_test.py
__name__: __main__
os.path.dirname(__file__):
os.path.abspath(__file__): /smbshare/path_test.py
os.path.dirname(os.path.abspath(__file__)): /smbshare
getcwd(): /smbshare
root@ubuntu:/smbshare#
root@ubuntu:/smbshare# python path_test-2.py
__file__: /smbshare/path_test.pyc
__name__: path_test
os.path.dirname(__file__): /smbshare
os.path.abspath(__file__): /smbshare/path_test.pyc
os.path.dirname(os.path.abspath(__file__)): /smbshare
getcwd(): /smbshare
然后在另外一个目录下执行:
root@ubuntu:/usr/local/lib# python /smbshare/path_test.py
__file__: /smbshare/path_test.py
__name__: __main__
os.path.dirname(__file__): /smbshare
os.path.abspath(__file__): /smbshare/path_test.py
os.path.dirname(os.path.abspath(__file__)): /smbshare
getcwd(): /usr/local/lib
root@ubuntu:/usr/local/lib#
root@ubuntu:/usr/local/lib# python /smbshare/path_test-2.py
__file__: /smbshare/path_test.pyc
__name__: path_test
os.path.dirname(__file__): /smbshare
os.path.abspath(__file__): /smbshare/path_test.pyc
os.path.dirname(os.path.abspath(__file__)): /smbshare
getcwd(): /usr/local/lib
在不同的目录下,以及通过直接执行和导入执行,__file__变量代表的值都是不一样的。因此,在程序中, 绝对不可以用__file__来获取文件的路径。
通过程序运行结果,可以看到:假如想获取文件的绝对全路径,只可以用 os.path.abspath(__file__)
,
如果想获取文件所在的完整目录:只可以用 os.path.dirname(os.path.abspath(__file__))
。
另外值得一提的是,自己原来也使用过这样的方式,来获取与当前文件在同一个目录的文件绝对路径:
abs_path = os.path.abspath(__file__)
name = ["glusterrest.ini"]
return '/'.join(abs_path.split("/")[:-1] + name)
15.2. 文件和目录操作¶
15.2.1. 目录下所有文件¶
>>> os.listdir('.')
['.idea', 'db.sqlite3', 'manage.py', 'demo', 'static', 'templates', 'dj_websocket']
15.2.2. 获取文件属性¶
>>> os.stat('manage.py')
posix.stat_result(st_mode=33188, st_ino=7602258, st_dev=64512L,
st_nlink=1, st_uid=0, st_gid=0, st_size=810, st_atime=1504676329,
st_mtime=1504589646, st_ctime=1504589646)
15.2.3. 根据文件属性获取文件用户、组信息¶
>>> import pwd
>>> pw = pwd.getpwuid(0)
>>>
>>> pw
pwd.struct_passwd(pw_name='root', pw_passwd='x', pw_uid=0,
pw_gid=0, pw_gecos='root', pw_dir='/root', pw_shell='/bin/bash')