首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Python re 模組 TypeError: expected string or bytes-like object 根因與修正指南

     編輯:程式設計綜合問答

初學者常在 re.search(pattern, file_object) 時遇到 TypeError: expected string or bytes-like object。本文解釋錯誤根因:re 模組只接受 str/bytes,不支援 _io.TextIOWrapper、list 等可迭代物件,並提供三種標準修正模式。

錯誤重現

with open('data.txt', 'r', encoding='utf-8') as f:
    # 錯誤:直接傳遞 file object
    match = re.search(r'\d+', f)   # TypeError!

根因分析

  • open() 回傳 _io.TextIOWrapper (文字模式) 或 _io.BufferedReader (二進位模式)。
  • re.search() 簽名:re.search(pattern, string, flags=0),string 必須是 str 或 bytes。
  • Python 不會自動將檔案物件「讀取成字串」再傳給正則函式。

三種標準修正模式

模式一:一次性讀取全文 (適合中小檔案 < 100MB)

with open('data.txt', 'r', encoding='utf-8') as f:
    content = f.read()              # 讀成完整字串
    match = re.search(r'\d+', content)

模式二:逐行處理 (適合大檔案、記憶體敏感)

with open('data.txt', 'r', encoding='utf-8') as f:
    for line in f:                  # 逐行迭代,每行是 str
        match = re.search(r'\d+', line)
        if match:
            print(match.group())

模式三:mmap 記憶體映射 (超大檔案、需隨機存取)

import mmap
with open('data.txt', 'r+b') as f:
    mm = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
    match = re.search(rb'\d+', mm)  # 注意:bytes 模式需用 rb 前綴
    mm.close()

常見誤區對照表

錯誤寫法錯誤原因正確寫法
re.search(pat, open(...))傳遞 file objectre.search(pat, open(...).read())
re.search(pat, f.readlines())傳遞 list[str]逐行迭代 for line in f:
re.search(pat, f.buffer)傳遞 BufferedReaderre.search(pat, f.buffer.read()) 或 mmap
str(f) 強制轉換得到 "<_io.TextIOWrapper ...>" 而非檔案內容同上

進階技巧:編譯正則複用

import re
PATTERN = re.compile(r'\d{4}-\d{2}-\d{2}')  # 編譯一次,多次使用

with open('log.txt', 'r', encoding='utf-8') as f:
    for line in f:
        m = PATTERN.search(line)
        if m:
            print(m.group())

官方文件參考

總結

re 模組只吃字串/位元組,不吃檔案物件、列表、生成器。養成「先讀取再匹配」或「逐行讀取匹配」的習慣,並善用 re.compile 提升效能,即可徹底避開 TypeError: expected string or bytes-like object。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved