Vấn đề ..
Giả sử bạn có một thư mục chứa đầy các tệp với các định dạng khác nhau, để tìm kiếm một từ khóa cụ thể.
Chuẩn bị ..
Cài đặt các gói bên dưới.
1. beautifulsoup4
2. python-docx
Cách thực hiện ...
1. Viết một hàm để tìm kiếm một chuỗi ở định dạng CSV. Tôi sẽ sử dụng mô-đun csv.reader để xem qua tệp và tìm kiếm chuỗi và trả về True khi tìm thấy nếu khác False.
Ví dụ
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. Chức năng tìm kiếm một tệp văn bản. Điều này hơi phức tạp vì chúng ta cần xử lý mã hóa. Có hàng nghìn cách mã hóa và việc xác định định dạng mã hóa có lẽ là phần khó nhất. Dĩ nhiên, chúng tôi có thể quay lại người dùng đã tạo tệp văn bản nhưng chúng tôi đang tự động hóa nó đúng không.
Vì vậy, chúng tôi sẽ sử dụng UnicodeDammit để xác định mã hóa.
Ví dụ
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. Chức năng tìm kiếm một chuỗi trong tài liệu MS Word.
Ví dụ
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.Bây giờ, chúng ta cần có hàm main để lặp qua các tệp và gọi các hàm tương ứng với chuỗi để tìm kiếm. Ở đây tôi giả sử mã và tệp đầu vào để tìm kiếm nằm trong cùng một thư mục. Bạn có thể thêm tham số đường dẫn nếu thư mục của bạn ở một vị trí khác.
Ví dụ
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.Nhập các chức năng của chúng tôi vào phần mở rộng tệp bằng cách tạo từ điển.
Ví dụ
EXTENSIONS ={ 'csv': csv_stringsearch, 'txt': text_stringsearch, 'docx': MSDocx_stringsearch, }
Ví dụ
6. ghép tất cả lại với nhau.
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())
Đầu ra
*** Yeah String found in .\Hello_World.docx *** Yeah String found in .\My_Amazing_WordDoc.docx
7. Trong trường hợp bạn muốn thay đổi chương trình thành thực thi dòng lệnh, hãy sử dụng argparse.
Ví dụ
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())