Ошибки с открытыми неизвестными файлами - PullRequest
0 голосов
/ 19 сентября 2018

В приведенном выше коде, который представляет собой скрипт поиска файлов, содержится 2 файла;во-первых, SearchApp.py, который является классом с некоторыми методами для получения места назначения и текстом для его поиска.Во-вторых, Main.py, который является файлом, который я импортировал SearchApp.py, и я использовал его методы там.
когда я пытаюсь найти текст в каталоге, в котором содержится скрипт, он работает нормально,но всякий раз, когда я пытаюсь искать в других каталогах, происходит что-то плохое, и это вызывает ошибку кодировки, FileNotFound и ... Вот SearchApp.py:

import os

class Searcher(object):
    """Search class for our app :D """
    def __init__(self):
        self.items = []
        self.matches = []


    def header():
        print("TATI Search App".center(75,'-'))



    def get_destinition(self):
        path = input("Where should I search? ")
        if not path or not path.strip():
            return None
        if not os.path.isdir(path):
            return None

        return os.path.abspath(path)



    def get_text(self):
        text = input('enter text to search: ')
        return text



    def search_dir(self, directory, text):
        self.directory = directory
        self.text = text

        items_in_dir = os.listdir(directory)

        for item in items_in_dir:
            if not os.path.isdir(os.path.join(directory,item)):
                self.items.append(os.path.join(directory,item))


    def search_text(self,target):
        self.target = target

        for file in self.items:
            with open (file,'r',encoding='utf-8')as f:
                for line in f:
                    if line.find(target) >0:
                        self.matches.append(line)
        for found_item in self.matches:
            print(found_item)

Это Main.py:

from searchApp import Searcher

searcher = Searcher()
path = searcher.get_destinition()
target = searcher.get_text()

directories = searcher.search_dir(path,target)
searcher.search_text(target)

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Вопрос : при поиске в других каталогах происходят плохие вещи и возникает ошибка кодирования, FileNotFound

Вероятно, вы пытаетесь открыть каталог .
Тестировать с os.path.isfile(...) и обрабатывать только эти файлы.

Вы также должны, как указал @ Ven Ify , открывать и читать только Текстовые файлы *.
Простым подходом будут расширения файлов, например .txt .
Но имейте в виду, что это не всегда так.

Например:

import os

root = "../test"
# Loop the os.listdir entrys
for entry in os.listdir(root):
    # Create a relative Path
    fpath = os.path.join(root, entry)

    # Test if it's a regular file
    if os.path.isfile(fpath):

        # Get the Filename Extension
        ext = os.path.splitext(entry)
        print("\t{} ext:{}".format(entry, os.path.splitext(entry)))

        # Test if Extension is in your List of Extensions
        if ext[1] in ['.txt', '.py']:
            print("\t\tProcess {}".format(fpath))
        else:
            print("Skipt '{}', file extension not in list!".format(entry))

    else:
        print("Skip '{}', is not a file!".format(entry))

Выход :

    test.lnk ext:('test', '.lnk')  
Skipt 'test.lnk', file extension not in list!  
    atom.xml ext:('atom', '.xml')  
Skipt 'atom.xml', file extension not in list!  
    power.txt ext:('power', '.txt')  
        Process ../test/power.txt  
Skip 'tar', is not a file!  
    test ext:('test', '')  
Skipt 'test', file extension not in list!  
    test.xlsx ext:('test', '.xlsx')  
Skipt 'test.xlsx', file extension not in list!  

Проверено на Python: 3.4.2

0 голосов
/ 19 сентября 2018

Я думаю, попробовать / кроме это хорошее решение.Я бы поставил его вокруг блока for line in f.Если для файла не удалось выполнить utf-8, вы можете повторить попытку с помощью open(file,'r', encoding='latin-1').Это не вызовет ошибок, как описано здесь , но если фактическая кодировка не похожа на латиницу-1, найденный контент может оказаться бесполезным.

Вы также можете проверить расширение файла и пропуститьнекоторые двоичные файлы, такие как .jpg, .exe, ...

Для ошибки FileNotFound необходимо проверить, существует ли файл с помощью os.path.isfile () перед открытием файла.Вы также можете сделать попытку / исключить около open(), потому что могут быть файлы, которые вы не можете открыть (неправильные разрешения, файл внезапно удален и т. Д.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...