如何使用Python扫描多种文档格式(CSV,文本,MS Word)的字符串?
问题..
假设您有一个目录,其中装有不同格式的文件,以搜索特定的关键字。
准备好..
安装以下软件包。
1.beautifulsoup4
2.python-docx
怎么做...
1.编写一个功能以搜索CSV格式的字符串。我将使用csv.reader模块遍历文件并搜索字符串,如果找到则返回True。
示例
def csv_stringsearch(input_file, input_string): """ 函数: 在 csv 文件中搜索字符串。 输入文件,输入字符串 """ 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.搜索文本文件的功能。这有点棘手,因为我们需要处理编码。有成千上万种编码,确定编码格式可能是最困难的部分。当然,我们可以返回创建文本文件的用户,但是嘿,我们正在将其自动化。
因此,我们将使用UnicodeDammit确定编码。
示例
def text_stringsearch(input_file, input_string): """ 函数:在文本文件中搜索字符串。 args:输入文件,输入字符串 """ with open(filename, 'rb') as file: content = file.read(1024) guessencoding = UnicodeDammit(content) encoding = guessencoding.original_encoding #打开并读取 with open(input_file, encoding=encoding) as file: for line in file: if input_string in line.lower(): return True return False
3.用于在MSWord文档中搜索字符串的功能。
示例
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): """ 函数:打开当前目录并在所有文件中搜索字符串 args:输入字符串 """ 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): """ 函数: 在 csv 文件中搜索字符串。 输入文件,输入字符串 """ 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.如果要将程序更改为命令行执行,请使用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())