ปัญหา..
สมมติว่าคุณมีไดเร็กทอรีที่เต็มไปด้วยไฟล์ที่มีรูปแบบต่างกัน เพื่อค้นหาคีย์เวิร์ดเฉพาะ
เตรียมพร้อม..
ติดตั้งแพ็คเกจด้านล่าง
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())