溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python如何使用glob檢索文件

發布時間:2022-02-19 16:53:48 來源:億速云 閱讀:180 作者:iii 欄目:開發技術
# Python如何使用glob檢索文件

## 目錄
1. [glob模塊簡介](#glob模塊簡介)
2. [基本通配符使用](#基本通配符使用)
3. [遞歸文件搜索](#遞歸文件搜索)
4. [路徑名模式匹配](#路徑名模式匹配)
5. [glob與正則表達式對比](#glob與正則表達式對比)
6. [實際應用案例](#實際應用案例)
7. [性能優化建議](#性能優化建議)
8. [常見問題解答](#常見問題解答)
9. [總結](#總結)

<a id="glob模塊簡介"></a>
## 1. glob模塊簡介

glob是Python標準庫中的一個模塊,專門用于文件路徑名的模式匹配。它源自Unix shell中的glob命令(global的縮寫),提供了一種簡單高效的方式來查找符合特定模式的文件路徑。

### 主要特點:
- 跨平臺支持(Windows/Unix)
- 支持基本的通配符(*, ?, [])
- 提供glob()和iglob()兩個主要函數
- 與os模塊無縫集成

### 基本導入方式:
```python
import glob

與類似模塊對比:

模塊 特點 適用場景
glob 簡單通配符匹配 快速文件查找
os 底層文件操作 精確控制文件系統
pathlib 面向對象路徑操作 現代Python項目
fnmatch 文件名匹配(不涉及路徑) 純字符串匹配

2. 基本通配符使用

2.1 星號(*)通配符

匹配任意長度字符(包括空字符):

# 查找所有.py文件
py_files = glob.glob('*.py')
print(py_files)  # 輸出: ['script1.py', 'test.py', 'main.py']

# 查找data目錄下所有.csv文件
csv_files = glob.glob('data/*.csv')

2.2 問號(?)通配符

匹配單個任意字符:

# 查找類似file1.txt, file2.txt等文件
files = glob.glob('file?.txt')

2.3 字符集([])通配符

匹配指定范圍內的單個字符:

# 查找file1.txt到file5.txt
files = glob.glob('file[1-5].txt')

# 查找a.txt或b.txt
files = glob.glob('[ab].txt')

轉義特殊字符

import glob
escaped = glob.escape('特殊*文件.txt')
files = glob.glob(escaped)

3. 遞歸文件搜索

Python 3.5+ 支持**模式:

# 遞歸查找所有子目錄中的.py文件
all_py_files = glob.glob('**/*.py', recursive=True)

# 結合使用示例
config_files = glob.glob('config/**/*.json', recursive=True)

傳統實現方式(Python 3.5之前)

import os
def find_files(pattern, path):
    result = []
    for root, _, _ in os.walk(path):
        for match in glob.glob(os.path.join(root, pattern)):
            result.append(match)
    return result

4. 路徑名模式匹配

4.1 絕對路徑匹配

abs_paths = glob.glob('/usr/local/*.sh')

4.2 相對路徑匹配

rel_paths = glob.glob('../images/*.png')

4.3 多級目錄模式

multi_level = glob.glob('src/*/tests/*.py')

4.4 排除特定文件

important_files = [f for f in glob.glob('*.docx') 
                  if not f.startswith('~$')]

5. glob與正則表達式對比

5.1 模式語法差異

模式 glob 正則表達式
任意字符 ? .
任意數量 * .*
字符集 [abc] [abc]
范圍 [a-z] [a-z]
非匹配集 [!abc] [^abc]

5.2 轉換示例

import re
from fnmatch import translate

glob_pattern = "data_[0-9].csv"
regex_pattern = translate(glob_pattern)
# 輸出: 'data_[0-9]\\.csv\\Z(?ms)'

5.3 何時選擇哪種方式

  • 使用glob當:

    • 需要簡單文件匹配
    • 處理實際文件系統路徑
    • 需要跨平臺兼容性
  • 使用正則表達式當:

    • 需要復雜模式匹配
    • 匹配字符串而非文件路徑
    • 需要捕獲組等高級特性

6. 實際應用案例

6.1 批量重命名文件

import os
import glob

for filename in glob.glob('photo_*.jpg'):
    new_name = filename.replace('photo_', 'vacation_')
    os.rename(filename, new_name)

6.2 多類型文件處理

supported_formats = ('*.jpg', '*.png', '*.gif')
image_files = []
for fmt in supported_formats:
    image_files.extend(glob.glob(fmt))

6.3 項目文件統計

def count_loc():
    total_lines = 0
    for py_file in glob.glob('**/*.py', recursive=True):
        with open(py_file) as f:
            total_lines += len(f.readlines())
    return total_lines

6.4 配置文件加載

import json
config = {}
for config_file in glob.glob('config/*.json'):
    with open(config_file) as f:
        config.update(json.load(f))

7. 性能優化建議

7.1 使用iglob處理大量文件

# 返回生成器而非列表,節省內存
large_file_iter = glob.iglob('big_data/**/*.csv', recursive=True)
for file_path in large_file_iter:
    process_file(file_path)

7.2 縮小搜索范圍

# 不推薦 - 搜索范圍太大
all_files = glob.glob('**/*', recursive=True)

# 推薦 - 精確限定目錄層級
target_files = glob.glob('project/src/**/*.py', recursive=True)

7.3 緩存結果

from functools import lru_cache

@lru_cache(maxsize=128)
def get_cached_glob(pattern):
    return glob.glob(pattern)

7.4 并行處理(Python 3.8+)

import concurrent.futures

def process_file(file):
    # 文件處理邏輯
    pass

with concurrent.futures.ThreadPoolExecutor() as executor:
    files = glob.glob('large_dataset/*.csv')
    executor.map(process_file, files)

8. 常見問題解答

Q1: glob會匹配隱藏文件嗎?

在Unix系統中,以點(.)開頭的文件是隱藏文件。glob默認不匹配這類文件,除非模式明確包含點:

hidden_files = glob.glob('.*')

Q2: 如何實現不區分大小寫的匹配?

glob本身不支持,但可以通過組合實現:

import os
case_insensitive = [f for f in os.listdir() 
                   if f.lower().endswith('.pdf')]

Q3: glob返回結果的順序是怎樣的?

返回順序取決于文件系統實現,通常是無序的。需要排序可以:

sorted_files = sorted(glob.glob('*.txt'))

Q4: 如何處理路徑中的特殊字符?

使用glob.escape進行轉義:

safe_pattern = glob.escape('特殊*文件.txt') + '.txt'
files = glob.glob(safe_pattern)

Q5: Windows和Unix路徑差異如何解決?

建議: 1. 使用原始字符串(r’path\pattern’) 2. 使用pathlib進行路徑操作 3. 避免硬編碼路徑分隔符

9. 總結

glob模塊作為Python標準庫的一部分,提供了簡潔高效的文件路徑匹配方案。通過本文我們了解了:

  1. 基本通配符的使用方法和組合技巧
  2. 遞歸搜索的兩種實現方式
  3. 與正則表達式的區別和適用場景
  4. 多個實際應用案例
  5. 性能優化的專業建議

對于現代Python項目,可以考慮結合pathlib使用:

from pathlib import Path
py_files = list(Path().rglob('*.py'))  # 遞歸查找

記住,glob雖然簡單強大,但在處理超大型文件系統或需要復雜匹配時,可能需要考慮更專業的解決方案如find命令或專門的索引工具。

最佳實踐建議: - 簡單匹配優先使用glob - 復雜場景考慮pathlib+glob組合 - 注意跨平臺路徑處理 - 大量文件使用iglob節省內存 “`

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女