Как искать все типы файлов в каталоге для регулярного выражения - PullRequest
0 голосов
/ 30 ноября 2018

Итак, я хочу найти в моем каталоге все файлы, содержащие список регулярных выражений.Это включает в себя: каталоги, PDF-файлы и CSV-файлы.Я могу успешно выполнить эту задачу при поиске только текстовых файлов, но поиск всех типов файлов - это борьба.Ниже приведена моя работа:

import glob
import re
import PyPDF2
#-------------------------------------------------Input----------------------------------------------------------------------------------------------
folder_path = "/home/"
file_pattern = "/*"
folder_contents = glob.glob(folder_path + file_pattern)


#Search for Emails
regex1= re.compile(r'\S+@\S+')
#Search for Phone Numbers
regex2 = re.compile(r'\d\d\d[-]\d\d\d[-]\d\d\d\d')
#Search for Locations
regex3 =re.compile("([A-Z]\w+), ([A-Z]{2})")


for file in folder_contents:
    read_file = open(file, 'rt').read()
if readile_file == pdf:

    pdfFileObj = open('pdf.pdf', 'rb') 

    pdfReader = PyPDF2.PdfFileReader(pdfFileObj) 

    pageObj = pdfReader.getPage(0)  

    content= pageObj.extractText()) 

    if regex1.findall(read_file) or regex2.findall(read_file) or regex3.findall(read_file):
        print ("YES, This file containts PHI")
        print(file)
    else:
        print("No, This file DOES NOT contain PHI")
        print(file)

Когда я запускаю это, я получаю эту ошибку:

YES, This file containts PHI
/home/e136320/sample.txt
No, This file DOES NOT contain PHI
/home/e136320/medicalSample.txt

---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-129-be0b68229c20> in <module>()
     19 
     20 for file in folder_contents:
---> 21     read_file = open(file, 'rt').read()
     22 if readile_file == pdf:
     23     # creating a pdf file object
---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-128-1537605cf636> in <module>()
     18 
     19 for file in folder_contents:
---> 20     read_file = open(file, 'rt').read()
     21     if regex1.findall(read_file) or regex2.findall(read_file) or regex3.findall(read_file):
     22         print ("YES, This file containts PHI")

/jupyterhub_env/lib/python3.5/codecs.py in decode(self, input, final)
    319         # decode input (taking the buffer into account)
    320         data = self.buffer + input
--> 321         (result, consumed) = self._buffer_decode(data, self.errors, final)
    322         # keep undecoded input until the next call
    323         self.buffer = data[consumed:]

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc7 in position 10: invalid continuation byte

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Ваша проблема возникла при открытии файла другого типа таким же образом.Вы должны разобраться с ними.CSV может читать напрямую, но PDF не может этого сделать.Я использовал re.search(r".*(?=pdf$)",file) для предотвращения от 2.pdf.csv считается PDF-файл

import glob
import re
import PyPDF2
#-------------------------------------------------Input----------------------------------------------------------------------------------------------
folder_path = "/home/e136320/"
file_pattern = "/*"
folder_contents = glob.glob(folder_path + file_pattern)

#Search for Emails
regex1= re.compile(r'\S+@\S+')
#Search for Phone Numbers
regex2 = re.compile(r'\d\d\d[-]\d\d\d[-]\d\d\d\d')
#Search for Locations
regex3 =re.compile("([A-Z]\w+), ([A-Z]{2})")


for file in folder_contents:

    if re.search(r".*(?=pdf$)",file):
        #this is pdf
        with open(file, 'rb') as pdfFileObj:
            pdfReader = PyPDF2.PdfFileReader(pdfFileObj) 
            pageObj = pdfReader.getPage(0)  
            content = pageObj.extractText()
            read_file = #

    elif re.search(r".*(?=csv$)",file):
        #this is csv
        with open(file,"r+",encoding="utf-8") as csv:
            read_file = csv.read()

    else:
        #print("{}".format(file))
        continue

    if regex1.findall(read_file) or regex2.findall(read_file) or regex3.findall(read_file):
        print ("YES, This file containts PHI")
        print(file)
    else:
        print("No, This file DOES NOT contain PHI")
        print(file)
0 голосов
/ 30 ноября 2018

Вы не можете открыть PDF-файл подобным образом, он ожидает простой текстовый файл.Вы можете использовать что-то вроде этого:

fn, ext = os.path.splitext(file)

if ext == '.pdf':
    open_function = PyPDF2.PdfFileReader
else:  # plain text
    open_function = open

with open_function(file, 'rt') as open_file:
    # Do something with open file...

Этот фрагмент проверяет расширение файла, а затем назначает функцию открытия в зависимости от того, что он находит, это немного наивно и может быть сделано лучше в методе, аналогичномпоказано в этом ответе .

...