2016-09-14 244 views
1

我正在使用以下代碼使用RegEx將我的輸出打印到txt文件。不過我總是收到此錯誤信息:將RegEx寫入txt文件

File "C:\lib\re.py", line 213, in findall 
return _compile(pattern, flags).findall(string) 

類型錯誤:預期字符串或字節狀物體

import glob 
import os 
import re 


def extractor(): 
    os.chdir(r"F:\Test") 
    for file in glob.iglob("*.html"): # iterates over all files in the directory ending in .html 
     with open(file, encoding="utf8") as f, open((file.rsplit(".", 1)[0]) + ".txt", "w") as out: 
      contents = f.read() 
      extract = re.compile(r'RegEx', re.I | re.S) 
      if re.findall(extract, contents) is not None: 
       for x in re.findall(extract, contents): 
        out.write(x) 
      out.close() 
extractor() 

任何人的想法是什麼原因導致這個錯誤?顯然這與類型錯誤有關?

+0

使用're.compile(r'RegEx',re.I | re.S)'代替're.findall(r'RegEx',re.I | re.S)''。您必須有意在從「contents」中提取某些內容之前編譯正則表達式。 –

+0

仍在我的代碼行「out.write()」上收到錯誤消息。 TypeError:write()參數必須是str,而不是_sre.SRE_Pattern –

+0

是的,因爲現在'extract'是一個正則表達式對象。你需要在那裏寫出re.findall的結果。對於re.findall(提取,內容)中的x:out.write(x)'或如果在模式中有多個捕獲組,則對該元組進行連接。 –

回答

0

略調整:

import glob 
import os 
import re 


def extractor(): 
    # you only need it once, dont' you? 
    extract = re.compile(r'RegEx', re.I | re.S) 
    os.chdir(r"F:\Test") 
    for file in glob.iglob("*.html"): # iterates over all files in the directory ending in .html 
    with open(file, encoding="utf8") as f, open((file.rsplit(".", 1)[0]) + ".txt", "w") as out: 
     contents = f.read() 
     for match in extract.findall(contents): 
      out.write(match) 
     out.close() 

extractor() 

它使用extract爲對象,甚至不需要在循環的if not None檢查。
如果仍然無法正常工作,請詳細說明您的實際正則表達式(是否有多個組等?)。

+0

感謝您的幫助。不幸的是pycharm仍然給我一個錯誤信息:TypeError:write()參數必須是str,而不是元組。我更新了我的代碼,你可以看到我的RegEx,但它應該沒問題... –

+0

wie kommt man denn in den Chatraum? Dann kann ich dir mal ganz kurz schildern was mein Problem ist ohne hier den Rahmen mit Kommentaren zu sprengen –

+0

was das das denn gerade? –