獲取文件夾中的文件列表
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
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