在上面的代码中,它是一个文件搜索脚本,包含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)
答案 0 :(得分:1)
我认为try / except是一个很好的解决方案。我将其放在for line in f
块周围。如果文件的utf-8失败,则可以使用open(file,'r', encoding='latin-1')
重试。这不会产生here中所述的错误,但是如果实际编码与latin-1不相似,则检索到的内容可能会无用。
您还可以检查文件扩展名,并跳过某些二进制文件,例如.jpg,.exe等...
对于 FileNotFound 错误,您应该在打开文件之前检查文件是否存在os.path.isfile()。您还可以在open()
周围进行try / except,因为可能存在无法打开的文件(权限错误,文件突然删除等)
答案 1 :(得分:1)
问题:在其他目录中搜索会发生不好的事情,并且会引发编码错误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