先假設資料夾已經如下佈置,程式碼和要資料夾在同一級目錄下(這裡是

files

資料夾)

Python從檔案讀取文字並用正則表示式提取特定語料

其中,

files

資料夾下有這麼幾個檔案,每個檔案的內容如下(見記事本左上角檔名):

Python從檔案讀取文字並用正則表示式提取特定語料

Python檔案操作(參考註釋的說明)

讀取檔案

f

=

open

‘files/file1。txt’

#開啟檔案

t

=

f

read

()

#將檔案的內容讀取出來賦值給t

f

close

()

#將檔案關閉,如果不在程式碼中關閉,待會用記事本開啟可能被警告被佔用

#這時,t 是個字串,可以對它做一般的字串操作,比如print,下面print看它是否正常

print

t

Python從檔案讀取文字並用正則表示式提取特定語料

讀取正常。

寫檔案

f = open(‘result。txt’,‘w’)

#以“write”的方式開啟檔案

#如果要以“read”的方式開啟檔案,我們要給第二個引數賦值為‘r’,即f = open(‘。。檔名。。’,‘r’)

#但當第二個引數省略時,預設為‘r’

#即f = open(‘files/file1。txt’,‘r’)

#等價於

#f = open(‘files/file1。txt’)

#所以上面讀取檔案的例子中我們省略了第二個引數。

f。write(‘HHHHH’)#此時,我們將“HHHHH”寫入到了result。txt這個檔案中

f。write(‘\n’)#將換行符寫入到result。txt中

f。write(‘lalallala’)#繼續隨便寫東西

f。close()#將檔案關閉

程式碼執行後可以出去看看

result。txt

的檔案內容。

檢視資料夾下的檔案

import os #匯入os庫,這個庫可以實現我們要的功能,這個庫是官方的,不用另外下載

fs = os。listdir(‘files’) #這時,fs就得到了files資料夾下的所有檔名

print(fs)

Python從檔案讀取文字並用正則表示式提取特定語料

fs

中每個元素如上圖所示,但是,顯然,每個元素都只是檔案的檔名,但是我們要開啟

file1。txt

的話,我們的

open

裡寫的是

files/file1。txt

,也就是說,我們還需要寫明是哪個資料夾下的,要把路徑寫到能指向那個檔案,所以我們下面把每個元素都變成 方便 我們開啟檔案的形式。

for i in range(len(fs)):

fs[i] = ‘files’ + ‘/’ + fs[i] #給每個檔名前面加上資料夾的名字,並按照路徑的格式加斜線

RE正則表示式庫的使用

正則表示式(regular expression)簡稱RE。其學習參考如下連結:

假定我們有如下需求,給定一個字串

lskdjfklsdfsaldfsafd\nsdfsdaf\nbalabalalba\nsdf

,我們需要將

前面的尖括號對裡包圍著的

hhh

提取出來。我們可以寫出這樣一個正則表示式

<。*?>

來匹配內容我們需要的內容。

我們先對給定字串做個輸出觀察一下。(為了達到效果,我特定將這個字串寫成了多行多個目標的形式)

tt = ‘lskdjfklsdfsaldfsafd\nsdfsdaf\nbalabalalba\nsdf’

print(tt)

Python從檔案讀取文字並用正則表示式提取特定語料

下面開始

re

庫使用及上述匹配的實現。

import re #匯入re庫

pattern = re。compile(‘<。*?>’) #定義一個正則表示式

result = pattern。findall(tt) #進行匹配,找到所有滿足條件的

print(result) #輸出觀察結果

Python從檔案讀取文字並用正則表示式提取特定語料

可見,結果是個列表,並且找全了我們需要的。

假設我們現在希望把尖括號都去掉,已經後面的標識

也去掉,那麼我們可以這樣使用正則表示式

pattern_remove_tag = re。compile(“(?<=^<)。*(?=>)”)

for i in range(len(result)):

temp = pattern_remove_tag。findall(result[i])

result[i] = temp[0]

#查詢到每個元素中間我們要的東西,並替換

#但是由於findall得到的temp是個列表

#然後這個列表裡只有一個元素,也就是我們需要的東西,,比如hhh或idddd這樣的東西

#所以我們用這個temp的第0個元素來替換result[i]

print(result)

此時我們要將這些東西寫入檔案

result_test。txt

中。

f = open(‘result_test。txt’,‘w’)

result_wait_to_write = ‘\n’。join(result)

#在result這個列表的每個元素間,用換行符\n拼接成單獨一個字串

f。write(result_wait_to_write) #寫入檔案

f。close() #關閉檔案

現在可以取

result_test。txt

檔案下觀察結果。

下面我們展示從

files

資料夾下每個檔案讀取內容並匹配後寫入到一個

result。txt

檔案中。待會可以將如下程式碼直接作為整個

id_extract。py

的內容了。

import os

import re

result_list = []

pattern = re。compile(‘<。*?>’) #定義正則表示式

pattern_content = re。compile(‘(?<=^<)。*(?=>)’)

fs = os。listdir(‘files’)

for i in range(len(fs)): #構造檔案路徑

fs[i] = ‘files’ + ‘/’ + fs[i]

for i in range(len(fs)):

f = open(fs[i]) #開啟檔案

t = f。read() #讀取檔案

f。close() #關閉檔案

result_temp = pattern。findall(t) #進行匹配

for j in range(len(result_temp)):

temp_wait_to_replace = pattern_content。findall(result_temp[j])

result_temp[j] = temp_wait_to_replace[0] #完成最終內容的提取

result_list = result_list+result_temp #將兩個列表合起來,result_list每次都新增這次新找到的

print(fs[i],‘ is finished’) #提示一下這個檔案已完成

result_list_to_write = ‘\n’。join(result_list) #用換行符拼接成整一個字串,方便寫入檔案

f = open(‘result。txt’,‘w’)

f。write(result_list_to_write)

f。close() #寫入檔案完成

print(‘result file is ok’) #又是提示一下,完工啦,啦啦啦啦啦

整個檔案如圖

Python從檔案讀取文字並用正則表示式提取特定語料