파일이 너무 많아서 트래버스하고 일부 문자열을 검색해야합니다. 문자열이 발견되면 파일이 새 파일로 복사됩니다. 폴더에 저장합니다. 그렇지 않으면 닫힙니다. 여기 새로운 클래스에서 많은 양의 파일을 읽고 닫으면 OSError가 발생 함 : 열려있는 파일이 너무 많음
은 예제 코드입니다 :import os
import stringsfilter
def apply_filter(path, filter_dict):
dirlist = os.listdir(path)
for directory in dirlist:
pwd = path + '/' + directory
filelist = os.listdir(pwd)
for filename in filelist:
if filename.split('.')[-1] == "stats":
sfilter = stringsfilter.StringsFilter(pwd, filename, filter_dict["strings"])
sfilter.find_strings_and_move()
여기 stringsfilter.py입니다 :
import main
import codecs
import os
import shutil
class StringsFilter:
strings = None
def __init__(self, filepath, filename, strings):
self.filepath = filepath
self.filename = filename
self.strings = strings
self.logger = main.get_module_logger("StringsFilter")
self.file_desc = codecs.open(self.filepath + '/' + self.filename, 'r', encoding="utf-8-sig")
self.logger.debug("[-] Strings: " + str(self.strings))
self.logger.debug("[-] Instantiating class Strings Filter, filename: %s " % self.filename)
def find_strings_and_move(self):
for line in self.file_desc.readlines():
for string in self.strings:
if string in line:
self.move_to_folder()
return
self.close()
def move_to_folder(self):
name = self.filename.split('.')[0]
os.mkdir(self.filepath + '/' + name)
shutil.copyfile(self.filepath + '/' + self.filename,
self.filepath + '/' + name + '/' + self.filename)
self.close()
def close(self):
if self.file_desc:
self.logger.debug("[-] Closing file %s" % self.filename)
self.file_desc.close()
main.py :
내가 로그에import logging
def get_module_logger(name):
# create logger
logger = logging.getLogger(name)
# set logging level to log everything
logger.setLevel(logging.DEBUG)
# create file handler which logs everything
fh = logging.FileHandler('files.log')
fh.setLevel(logging.DEBUG)
# create console handler
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)
# create formatter and add it to the handlersi
formatter = logging.Formatter('[%(asctime)s] [%(name)-17s] [%(levelname)-5s] - %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# add the handlers to the logger
logger.addHandler(fh)
logger.addHandler(ch)
return logger
다음을 참조 할 수 있습니다
[2016-10-13 10:07:07,002] [StringsFilter ] [DEBUG] - [-] Strings: ['DEVICE_PROBLEM']
[2016-10-13 10:07:07,002] [StringsFilter ] [DEBUG] - [-] Instantiating class Strings Filter, filename: file1.stats
[2016-10-13 10:07:07,003] [StringsFilter ] [DEBUG] - [-] Closing file file1.stats
[2016-10-13 10:07:07,003] [StringsFilter ] [DEBUG] - [-] Strings: ['DEVICE_PROBLEM']
[2016-10-13 10:07:07,003] [StringsFilter ] [DEBUG] - [-] Strings: ['DEVICE_PROBLEM']
[2016-10-13 10:07:07,004] [StringsFilter ] [DEBUG] - [-] Instantiating class Strings Filter, filename: file2.stats
[2016-10-13 10:07:07,004] [StringsFilter ] [DEBUG] - [-] Instantiating class Strings Filter, filename: file2.stats
[2016-10-13 10:07:07,004] [StringsFilter ] [DEBUG] - [-] Closing file file2.stats
[2016-10-13 10:07:07,004] [StringsFilter ] [DEBUG] - [-] Closing file file2.stats
[2016-10-13 10:07:07,005] [StringsFilter ] [DEBUG] - [-] Strings: ['DEVICE_PROBLEM']
[2016-10-13 10:07:07,005] [StringsFilter ] [DEBUG] - [-] Strings: ['DEVICE_PROBLEM']
[2016-10-13 10:07:07,005] [StringsFilter ] [DEBUG] - [-] Strings: ['DEVICE_PROBLEM']
[2016-10-13 10:07:07,005] [StringsFilter ] [DEBUG] - [-] Instantiating class Strings Filter, filename: file3.stats
[2016-10-13 10:07:07,005] [StringsFilter ] [DEBUG] - [-] Instantiating class Strings Filter, filename: file3.stats
[2016-10-13 10:07:07,005] [StringsFilter ] [DEBUG] - [-] Instantiating class Strings Filter, filename: file3.stats
[2016-10-13 10:07:07,006] [StringsFilter ] [DEBUG] - [-] Closing file file3.stats
[2016-10-13 10:07:07,006] [StringsFilter ] [DEBUG] - [-] Closing file file3.stats
[2016-10-13 10:07:07,006] [StringsFilter ] [DEBUG] - [-] Closing file file3.stats
그리고 그것은 계속,을 초기화하기 에서 각 문장이 너무 많은 파일이 열려있는 프로그램이
OSError: [Errno 24] Too many files open
내가 이해할 수와 함께 종료 될 때까지, 한 번 더 할 때마다 반복을 가진 것 같아 의 문장이 인스턴스가 생성 될 때마다 여러 번 호출되는 이유는 무엇입니까? 당신은 같은 일을 왜
오류를 '가져 오기'주 'stringsfilter.py''라인 9시 defined'되지 않습니다. –
죄송합니다. 이제 추가되었습니다. – Libor