Errores con archivos desconocidos abiertas

votos
0

En el código anterior, que es un script de búsqueda de archivos, contiene 2 archivos; En primer lugar, la SearchApp.py que es una clase con algunos métodos para obtener destino y el texto para buscar allí. En segundo lugar, Main.py, que es un archivo que he importado SearchApp.py y Me'v utilizan métodos es allí.
cuando trato de buscar un texto en el directorio que contiene el script que funciona bien, pero cada vez que trato de buscar en otros directorios cosas malas suceden y se levanto la codificación de error, FileNotFound y ... Aquí es 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)

Esta es 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)
Publicado el 19/09/2018 a las 17:02
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
1

Pregunta : buscar en otros directorios cosas malas suceden y elevar el error de codificación, FileNotFound

Es probable que intenta abrir un directorio .
Prueba con os.path.isfile(...)y único proceso de esos archivos.

Usted también debería, como @Ven Ify señaló, solamente abrir y leer archivos de texto * .
Un enfoque simple será las extensiones de archivo, por ejemplo, .txt .
Pero hay que tener en cuenta que esto no es siempre el caso.

Por ejemplo:

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

salida :

    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!  

Probado con Python: 3.4.2

Respondida el 19/09/2018 a las 19:41
fuente por usuario

votos
1

Creo try / except es una buena solución. Yo lo pondría todo el for line in fbloque. Si no UTF-8 para un archivo, se puede volver a intentar con open(file,'r', encoding='latin-1'). Esto no va a elevar los errores como se describe aquí , pero si la codificación real no es similar a latino-1, el contenido recuperado podría ser inútil.

También puede comprobar la extensión de archivo y omitir archivos binarios como .jpg, .exe, ...

Para el FileNotFound error que debe comprobar si existe el archivo con os.path.isfile () antes de abrir el archivo. También se puede poner un try / excepto alrededor del open()porque puede haber archivos que no se puede abrir (permisos incorrectos, archivo repentinamente borrados, etc.)

Respondida el 19/09/2018 a las 18:39
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more