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] 匹配除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
相關文章
相關標籤/搜索