我有一个目录,我不时访问它来检查其内容,所以我创建了这个代码来检索该目录及其子目录中所有文件的列表路径:
our_dir='c:\\mydocs'
walk=os.walk(our_dir)
for path, folders, files in walk:
for f in files:
file_path=os.path.join(path,f)
print file_path
此目录包含200K +文件和频繁的文件更改和添加,因此在代码完成运行时,将添加/更改更多文件。问题是如何执行以下操作:
有关如何做到这一点的任何想法?我只想说清楚我不是在“监视/监视”目录,但我不时地访问它。
答案 0 :(得分:2)
这是一个非常基本的结构理念:每个文件夹都有自己的线程。您将拥有2个类,一个用于收集数据“directoryHelper”,另一个用于存储“Directory”。
需要两个类,因为一个线程只能启动一次,并且您需要能够为已经列出的目录生成一个新线程,而不会丢失它的数据。
根目录将是一个Directory实例,它列出了它的给定路径('C:\ mydocs')。它会将文件列表存储在self.files中,并为其包含的每个目录创建一个新的Directory实例(不要忘记在self.dirs中访问它们。
刷新可以定时,并按照建议检查目录的修改日期。
这里有一些代码可以帮助您理解我的想法:
class Helper(threading.Thread):
def __init__(self, directory):
super(Helper, self).__init__()
self.directory = directory
self.start()
def run(self):
for path, folders, files in os.walk(self.directory.path):
for f in files:
self.directory.files.append(os.path.join(path, f))
for d in folders:
self.directory.dirs.append(Directory(os.path.join(path, d), self.directory.interval, self.directory.do))
self = None
class Directory(threading.Thread):
def __init__(self, path, interval=5, do=None):
super(Directory, self).__init__()
self.path = path
self.files, self.dirs = ([], [])
self.interval = interval
self.last_update = 0
self.helper = None
self.do = do # One flag to stop refreshing all instances
if do == None:
self.do = True
def run(self):
while self.do:
self.refresh()
time.sleep(self.interval)
def refresh(self):
# Only start a refresh if there self.helper is done and directory was changed
if not self.helper and self.has_changed():
self.last_update = int(time.time())
self.helper = Helper(self)
def has_changed(self):
return int(os.path.getmtime(self.path)) > self.last_update
我认为这应该足以让你入门!
编辑:我将代码更改为实际处于工作状态。或者至少我希望它是(我还没有测试过)!
编辑2:我实际上是花时间来测试它并修复它。我跑了:
if __name__ == '__main__':
root = Directory('/home/plg')
root.refresh()
root.helper.join()
for d in [root] + root.dirs:
for f in d.files:
print f
和
$ time python bin/dirmon.py | wc -l # wc -l == len(sys.stdout.readlines())
7805
real 0m0.078s
user 0m0.048s
sys 0m0.028s
这是每秒7805 / 0.078 = 100,064个文件。还不错! :)
编辑3(最后一个!): 我在'/'上运行测试,首先运行(没有缓存): 147551 / 4.103 =每秒35,961个文件
第二和第三:
$ time python bin/dirmon.py | wc -l
147159
real 0m1.213s
user 0m0.940s
sys 0m0.272s
$ time python bin/dirmon.py | wc -l
147159
real 0m1.209s
user 0m0.928s
sys 0m0.284s
147551 / 1.213 =每秒121,641个文件
147551 / 1.209 =每秒122,044个文件