python-操作文件和目录
python的 os 模块:
import os os.name # 操作系统类型
如果是 posix ,说明系统是Linux
、Unix
或Mac OS X
,如果是 nt ,就是Windows
系统。
os.uname() # 操作系统详情
uname() 函数在Windows上不提供,也就是说, os 模块的某些函数是跟操作系统相关的。
os.environ # 操作系统中定义的环境变量
os.environ.get('PATH') # 获取操作系统中定义的某个环境变量,此处是'PATH'
操作文件和目录的函数一部分放在os
模块中,一部分放在os.path
模块中,这一点要注意一下。
# 查看当前目录的绝对路径: os.path.abspath('.') '/Users/yhjin'
# 在某个目录下创建一个新目录,首先把新目录的完整路径表示出来: new_file_path = os.path.join('/Users/yhjin', 'testdir')
'/Users/yhjin/testdir'
# 然后创建一个目录:
os.mkdir(new_file_path)
# 删掉一个目录:
os.rmdir(new_file_path)
*注意: 把两个路径合成一个时,不要直接拼字符串,而要通过 os.path.join() 函数,这样可以正确处理不同操作系统的路径分隔符。在Linux/Unix/Mac下, os.path.join() 返回这样的字符串:
part-1/part-2
而windows下会返回这样的字符串:
part-1\part-2
os.path.split() 函数,把一个路径拆分为两部分,后一部分总是最后级别的目录或文件名:
os.path.split('/Users/yhjin/test') ('/Users/yhjin', 'test')
os.path.splitext() 函数, 把一个路径拆分为两部分, 后一部分是文件扩展名(注意是带'.'的):
os.path.splitext('/path/to/file.txt')
('/path/to/file', '.txt')
*注意: 这些合并、拆分路径的函数并不要求目录和文件要真实存在,它们只对字符串进行操作。
# 对文件重命名: os.rename('/Users/yhjin/testdir/test.log','/Users/yhjin/testdir/test.txt') # 删掉文件: os.remove('/Users/yhjin/testdir/test.txt')
os 模块无法复制文件,需要复制文件可以使用 shutil
模块的 copyfile() 函数.
其他一些常用方法:
# 列出指定路径下的所有文件名和文件夹名 os.listdir('.')
# 判断指定路径是否是文件夹 os.path.isdir('/Users/yhjin/testdir') True
# 判断指定路径是否是文件 os.path.isfile('/Users/yhjin/testdir')
# 获取文件大小 os.path.getsize('/Users/code_bunny/Desktop/1.pic.jpg')
一些栗子:
# 获取当前路径下的所有文件夹名 [x for x in os.listdir('.') if os.path.isdir(x)]
# 获取当前路径下的所有.py文件 [x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py']
综合栗子:
在当前目录以及当前目录的所有子目录下查找文件名包含指定字符串的文件,并打印出相对路径。
比如以上文件结构,找出test目录下的所有带有'test'的文件名, 并打印出相对路径。
import os pathout = os.path.abspath('.') def search(path, search_text): files = [x for x in os.listdir(path) if os.path.isfile(os.path.join(path, x))] for i in files: if search_text in i: print(os.path.join(path, i)) dirs = [x for x in os.listdir(path) if os.path.isdir(os.path.join(path, x))] for i in dirs: search(os.path.join(path, i), search_text) search(pathout, 'test') # 这里需要注意的是,isfile和isdir传入的必需是完整的 路径+文件 ,所以需要使用os.path.join方法,而不是只传入x
输出如下: