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

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

阅读更多:Python 教程

问题..

假设您有一个包含不同格式文件的目录,并要搜索特定关键字。

准备工作..

安装以下软件包。

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

# 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. 在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: 在CSV文件中搜索字符串。
args: 输入文件,输入字符串
"""
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: 在MS Word文档中搜索字符串。
args: 输入文件,输入字符串
"""
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: 在文本文件中搜索字符串。
args: 输入文件,输入字符串
"""
with open(input_file, '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

def main(input_string):
"""
Function: 打开当前目录并在所有文件中搜索字符串。
args: 输入字符串
"""
for root, dirs, files in os.walk('.'):
for file in files:

# 获取文件扩展名
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='输入要搜索的字符串', default='Hello')
args = parser.parse_args()
main(args.s.lower())

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程