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