Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python으로 여러 문서 형식(CSV, Text, MS Word)의 문자열을 스캔하는 방법은 무엇입니까?

<시간/>

문제..

특정 키워드를 검색하기 위해 다양한 형식의 파일로 가득 찬 디렉토리가 있다고 가정합니다.

준비 중..

아래 패키지를 설치하세요.

1. 아름다운 수프4

2. 파이썬-docx

방법...

1. CSV 형식의 문자열을 검색하는 함수를 작성하십시오. csv.reader 모듈을 사용하여 파일을 살펴보고 문자열을 검색하고 False가 발견되면 True를 반환합니다.

예시

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