Python之获取文件夹中文件列表以及glob与fnmatch模块的使用
获取文件夹中的文件列表
print(os.listdir("../secondPackage")) # ['__init__.py', 'secondCookBook.py', '文件与IO.py', 'testPackage', '迭代器与生成器.py'] # 注释: curdir = '.' pardir = '..' print(os.listdir(os.curdir)) # ['__init__.py', 'secondCookBook.py', '文件与IO.py', 'testPackage', '迭代器与生成器.py'] print(os.listdir(os.pardir)) # ['__init__.py', 'cookBook', 'secondPackage', 'cookBook.py']
通过某种方式过滤数据,可以考虑结合 os.path 库中的一些函数来使用列表推导。比如:
通过isfile判断是否是文件 files=[name for name in os.listdir("../secondPackage") if os.path.isfile(os.path.join("../secondPackage",name))] print(files) # ['__init__.py', 'secondCookBook.py', '文件与IO.py', '迭代器与生成器.py'] # isdir判断是否是目录 dirs=[name for name in os.listdir("../secondPackage") if os.path.isdir(os.path.join("../secondPackage",name))] print(dirs) # ['testPackage'] # 过滤一个目录的内容 startswith() 和 endswith() pyfiles = [name for name in os.listdir('../secondPackage') if name.endswith('.py')] print(pyfiles) # ['__init__.py', 'secondCookBook.py', '文件与IO.py', '迭代器与生成器.py']
文件名的匹配,你可能会考虑使用 glob 或 fnmatch 模块
glob模块的主要方法就是glob,该方法返回所有匹配的文件路径列表(list);该方法需要一个参数用来指定匹配的路径字符串(字符串可以为绝对路径也可以为相对路径),其返回的文件名只包括当前目录里的文件名,不包括子文件夹里的文件。
import glob # 在 secondPackage 文件夹下找所有的py 文件 print(glob.glob(r"../secondPackage/*.py")) # ['../secondPackage/__init__.py', '../secondPackage/secondCookBook.py', '../secondPackage/文件与IO.py', '../secondPackage/迭代器与生成器.py'] # iglob方法 获取一个迭代器( iterator )对象,使用它可以逐个获取匹配的文件路径名,与glob.glob()的区别是:glob.glob同时获取所有的匹配路径,而 glob.iglob一次只获取一个匹配路径 print([res for res in glob.iglob(r"../secondPackage/*.py")]) # ['../secondPackage/__init__.py', '../secondPackage/secondCookBook.py', '../secondPackage/文件与IO.py', '../secondPackage/迭代器与生成器.py']
glob模块支持的通配符:
通配符 |
功能 |
* |
匹配0或多个字符 |
** |
匹配所有文件、目录、子目录和子目录里的文件(3.5版本新增) |
? |
匹配1个字符,与正则表达式里的?不同 |
[exp] |
匹配指定范围内的字符,如:[1-9]匹配1至9范围内的字符 |
[!exp] |
匹配不在指定范围内的字符 |
fnmatch模块,fnmatch、fnmatchcase、filter和translate
- fnmatch:判断文件名是否符合特定的模式。
- fnmatchcase:判断文件名是否符合特定的模式,区分大小写。
- filter:返回输入列表中,符合特定模式的文件名列表。
- translate:将通配符模式转换成正则表达式。
import fnmatch print([name for name in os.listdir(os.curdir) if fnmatch.fnmatch(name,'*.py')]) # ['__init__.py', 'secondCookBook.py', '文件与IO.py', '迭代器与生成器.py'] namelist=os.listdir(os.curdir) print(fnmatch.filter(namelist,'*.py')) # 区别是接受的第一个参数是列表 # ['__init__.py', 'secondCookBook.py', '文件与IO.py', '迭代器与生成器.py']
fnmatch模块支持的通配符:
通配符 | 含义 |
---|---|
* | 匹配任何数量的字符 |
? | 匹配单个字符 |
[seq] | 匹配seq中的字符 |
[!seq] |
glob模块和fnmatch模块区别
fnmatch模块,都是利用os.listdir获取文件列表,然后通过字符串fnmatch模块进行文件名匹配的,而glob模块比较简单,直接 实现了os.listdir 加上 fnmatch的功能
# 结合使用例子: pyfiles = glob.glob(r"../secondPackage/*.py") pystate=[(name,os.stat(name))for name in pyfiles] for name,state in pystate: print(name,state.st_size,state.st_mtime) # ../secondPackage/__init__.py 73 1550806762.0806901 # ../secondPackage/secondCookBook.py 73 1550806783.724303 # ../secondPackage/文件与IO.py 11685 1552458917.495922 # ../secondPackage/迭代器与生成器.py 6428 1551944052.2551782