Computer >> Máy Tính >  >> Lập trình >> Python

Làm cách nào để quét một chuỗi ở nhiều định dạng tài liệu (CSV, Văn bản, MS Word) bằng Python?

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