如何使用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.用于在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):
"""
函数:打开当前目录并在所有文件中搜索字符串
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())