我正在嘗試構建一個腳本,該腳本可以查找某個檔案夾中的所有檔案,并提取包含關鍵字或短語的任何文本行。
對 python 來說非常陌生,并沒有真正理解如何將我見過的其他人的多個建議拼湊在一起。
import re
from glob import glob
search = []
linenum = 0
pattern = re.compile("Dawg", re.IGNORECASE) # Compile a case-insensitive regex
path = 'C:\\Users\\Username\\Downloads\Testdataextraction\\Throw it in\\Audit_2022.log'
filenames = glob('*.log')
print(f"\n{filenames}")
with open (path, 'rt') as myfile:
for line in myfile:
linenum = 1
if pattern.search(line) != None: # If a match is found
search.append((linenum, line.rstrip('\n')))
for x in search: # Iterate over the list of tuples
print("\nLine " str(x[0]) ": " x[1])
這完全符合我的要求,除了一次只能看到一個檔案。當我嘗試從 path = 行的末尾洗掉“Audit_2022.log”時,出現了我的問題。
Python 說"PermissionError: [Errno 13] Permission denied: 'C:\Users\Username\Downloads\Testdataextraction\Throw it in'"。我認為這是因為它正在查看目錄而不是檔案,但是我怎樣才能讓它讀取多個檔案?
提前謝謝了!
uj5u.com熱心網友回復:
假設您還需要顯示檔案名,您可以這樣做:
import re
from glob import glob
import os
p = re.compile('Dawg', re.IGNORECASE)
path = r'C:\Users\Username\Downloads\Testdataextraction\Throw it in'
for file in glob(os.path.join(path, '*.log')):
with open(file) as logfile:
for i, line in enumerate(map(str.strip, logfile), 1):
if p.search(line) is not None:
print(f'File={file}, Line={i}, Data={line}')
uj5u.com熱心網友回復:
你得到那個例外的原因是因為open需要一個檔案名,如果你只給它一個路徑,它真的不知道該怎么做。一個最小的例子可能是:
path = 'C:\\Users\\Username\\Downloads\Testdataextraction\\Throw it in\\Audit_2022.log'
with open (path, 'rt') as f:
pass
如果檔案存在,這應該可以正常運行,但是如果您將其更改為:
path = 'C:\\Users\\Username\\Downloads\Testdataextraction\\Throw it in'
with open (path, 'rt') as f:
pass
那么這將拋出例外。
我懷疑您正在嘗試做的是遍歷所有日志檔案path并嘗試每個日志檔案,例如:
import os
path = 'C:\\Users\\Username\\Downloads\Testdataextraction\\Throw it in'
filenames = glob(os.path.join(path, '*.log'))
print(f"\n{filenames}")
for filename in filenames:
with open (filename, 'rt') as myfile:
...
uj5u.com熱心網友回復:
您可以使用os.listdir()獲取目錄中的所有檔案,然后在file目錄中為每個檔案嵌套打開回圈:
import os
folder = 'C:\\Users\\Username\\Downloads\Testdataextraction\\Throw it in'
for file in glob(os.path.join(folder, '*.log')):
with open(file, 'rt') as myfile:
for line in myfile:
linenum = 1
if pattern.match(line): # If a match is found
search.append((linenum, line.rstrip('\n')))
查看
os.path.join()更好的路徑加入替代方案
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/476869.html
上一篇:如何從帶有id的檔案中提取文本?
下一篇:GridFS大檔案下載使Node.js服務器崩潰。MongoServerError:排序超出了位元組的記憶體限制
