ปัญหา..
สมมติว่าคุณมีไดเร็กทอรีที่เต็มไปด้วยไฟล์ที่มีรูปแบบต่างกัน เพื่อค้นหาคีย์เวิร์ดเฉพาะ
เตรียมพร้อม..
ติดตั้งแพ็คเกจด้านล่าง
1. beautifulsoup4
2. python-docx
ทำอย่างไร...
1. เขียนฟังก์ชันเพื่อค้นหาสตริงในรูปแบบ CSV ฉันจะใช้โมดูล csv.reader เพื่ออ่านไฟล์และค้นหาสตริงและคืนค่า True เมื่อพบว่าเป็นเท็จ
ตัวอย่าง
def csv_stringsearch(input_file, input_string): """ Function: search a string in csv files. args: input file , input string """ with open(input_file) as file: for row in csv.reader(file): for column in row: if input_string in column.lower(): return True return False
2.Function เพื่อค้นหาไฟล์ข้อความ สิ่งนี้ค่อนข้างยุ่งยากเนื่องจากเราต้องจัดการกับการเข้ารหัส มีการเข้ารหัสหลายพันรูปแบบและการกำหนดรูปแบบการเข้ารหัสอย่างเหมาะสมเป็นส่วนที่ยากที่สุด แน่นอน เราสามารถกลับไปที่ผู้ใช้ที่สร้างไฟล์ข้อความได้ แต่เดี๋ยวก่อน เรากำลังทำให้มันถูกต้องโดยอัตโนมัติ
ดังนั้น เราจะใช้ UnicodeDammit เพื่อกำหนดการเข้ารหัส
ตัวอย่าง
def text_stringsearch(input_file, input_string): """ Function: search a string in text files. args: input file , input string """ with open(filename, 'rb') as file: content = file.read(1024) guessencoding = UnicodeDammit(content) encoding = guessencoding.original_encoding # Open and read with open(input_file, encoding=encoding) as file: for line in file: if input_string in line.lower(): return True return False
3.Function เพื่อค้นหาสตริงในเอกสาร MS Word
ตัวอย่าง
def MSDocx_stringsearch(input_file, input_string): """ Function: search a string in MS Word documents. args: input file , input string """ doc = docx.Document(input_file) for paragraph in doc.paragraphs: if input_string in paragraph.text.lower(): return True return False
4.ตอนนี้ เราจำเป็นต้องมีฟังก์ชันหลักเพื่อวนรอบไฟล์และเรียกใช้ฟังก์ชันที่สัมพันธ์กับสตริงเพื่อค้นหา ในที่นี้ ฉันคิดว่าโค้ดและไฟล์อินพุตที่จะค้นหาอยู่ในไดเร็กทอรีเดียวกัน คุณสามารถเพิ่มพารามิเตอร์พาธได้หากไดเร็กทอรีของคุณอยู่ในตำแหน่งอื่น
ตัวอย่าง
def main(input_string):
"""
Function: Open the current directory and search for a string in all the files
args: input string
"""
for root, dirs, files in os.walk('.'):
for file in files:
# Get the file extension
extension = file.split('.')[-1]
if extension in function_maps:
search_file = function_maps.get(extension)
full_file_path = os.path.join(root, file)
if search_file(full_file_path, input_string):
print(f' *** Yeah String found in {full_file_path}') 5.จับคู่ฟังก์ชันของเรากับนามสกุลไฟล์โดยสร้างพจนานุกรม
ตัวอย่าง
EXTENSIONS ={
'csv': csv_stringsearch,
'txt': text_stringsearch,
'docx': MSDocx_stringsearch,
} ตัวอย่าง
6.นำทุกอย่างมารวมกัน
import os
import argparse
import csv
import docx
from bs4 import UnicodeDammit
def csv_stringsearch(input_file, input_string):
"""
Function: search a string in csv files.
args: input file , input string
"""
with open(input_file) as file:
for row in csv.reader(file):
for column in row:
if input_string in column.lower():
return True
return False
def MSDocx_stringsearch(input_file, input_string):
"""
Function: search a string in MS Word documents.
args: input file , input string
"""
doc = docx.Document(input_file)
for paragraph in doc.paragraphs:
if input_string in paragraph.text.lower():
return True
return False
def text_stringsearch(input_file, input_string):
"""
Function: search a string in text files.
args: input file , input string
"""
with open(input_file, 'rb') as file:
content = file.read(1024)
guessencoding = UnicodeDammit(content)
encoding = guessencoding.original_encoding
# Open and read
with open(input_file, encoding=encoding) as file:
for line in file:
if input_string in line.lower():
return True
return False
def main(input_string):
"""
Function: Open the current directory and search for a string in all the files
args: input string
"""
for root, dirs, files in os.walk('.'):
for file in files:
# Get the file extension
extension = file.split('.')[-1]
if extension in function_mapping:
search_file = function_mapping.get(extension)
full_file_path = os.path.join(root, file)
if search_file(full_file_path, input_string):
print(f' *** Yeah String found in {full_file_path}')
function_mapping = {
'csv': csv_stringsearch,
'txt': text_stringsearch,
'docx': MSDocx_stringsearch,
}
if __name__ == '__main__':
string_to_search = 'Hello'
print(f'Output \n')
main(string_to_search.lower()) ผลลัพธ์
*** Yeah String found in .\Hello_World.docx *** Yeah String found in .\My_Amazing_WordDoc.docx
7.หากต้องการเปลี่ยนโปรแกรมเป็น command line ให้ใช้ argparse
ตัวอย่าง
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('-s', type=str, help='Input string to search', default='Hello')
args = parser.parse_args()
main(args.s.lower())