Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

วิธีค้นหาข้อความในไฟล์หลายรูปแบบ (CSV, Text, MS Word) ด้วย Python

ปัญหา

สมมติว่าคุณมีไดเรกทอรีเต็มไปด้วยไฟล์หลายรูปแบบ และต้องการค้นหาคีย์เวิร์ดเฉพาะ

เตรียมความพร้อม

ติดตั้งแพ็กเกจต่อไปนี้:

  1. beautifulsoup4
  2. python-docx

ขั้นตอนการทำงาน

1. ฟังก์ชันค้นหาในไฟล์ CSV

ใช้โมดูล csv.reader อ่านไฟล์และค้นหาสตริง คืนค่า True ถ้าพบ มิฉะนั้น False

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. ฟังก์ชันค้นหาในไฟล์ Text

ส่วนนี้ซับซ้อนกว่าเพราะต้องจัดการ encoding มี encoding หลายพันแบบ การกำหนด encoding เป็นส่วนยากที่สุด เราจะใช้ UnicodeDammit เพื่อเดา encoding

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 detected encoding
    with open(input_file, encoding=encoding) as file:
        for line in file:
            if input_string in line.lower():
                return True
    return False

3. ฟังก์ชันค้นหาในเอกสาร 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. ฟังก์ชันหลัก (main) วนลูปไฟล์และเรียกฟังก์ชันที่ตรงกัน

สมมติว่าโค้ดและไฟล์อยู่ในไดเรกทอรีเดียวกัน สามารถเพิ่มพารามิเตอร์ path ได้หากต่างไดเรกทอรี

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}')

5. Map ฟังก์ชันกับนามสกุลไฟล์ด้วย Dictionary

function_mapping = {
    '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 detected encoding
    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:
            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. ใช้ argparse สำหรับรันจาก command line

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())