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

จะสแกนหาสตริงในรูปแบบเอกสารหลายรูปแบบ (CSV, Text, MS Word) ด้วย Python ได้อย่างไร?


ปัญหา..

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

เตรียมพร้อม..

ติดตั้งแพ็คเกจด้านล่าง

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