如何使用 Python 扫描多种文档格式(CSV、文本、MS Word)中的字符串?

pythonserver side programmingprogramming更新于 2026/2/15 16:12:17

问题..

假设您有一个目录,其中包含各种格式的文件,用于搜索特定关键字。

准备就绪..

安装以下软件包。

1. beautifulsoup4

2. 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.搜索文本文件的函数。这有点棘手,因为我们需要处理编码。有成千上万种编码,确定编码格式可能是最困难的部分。当然,我们可以回到创建文本文件的用户,但嘿,我们正在自动化它。

因此,我们将使用 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

# 打开并读取
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.现在,我们需要有主函数来循环遍历文件并使用要搜索的字符串调用相应的函数。 这里我假设代码和要搜索的输入文件位于同一目录中。如果您的目录位于不同的位置,则可以添加路径参数。

示例

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.如果您想将程序更改为命令行执行,请使用 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())

相关文章


有用资源