python - 更新快速变化的目录中的文件路径列表

标签 python indexing information-retrieval

我有时会访问一个目录来检查其内容,因此我创建了此代码来检索该目录及其子目录中所有文件的列表路径:

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 个文件,并且经常更改和添加文件,因此当代码完成运行时,将添加/更改更多文件。问题是如何执行以下操作:

  1. 对代码进行初始运行,以列出所有文件路径 在此目录中,在初始运行之前创建/更改 开始时间
  2. 以某种方式存储在此期间添加/更改的文件 初始运行(初始运行开始时间和初始运行结束时间之间)
  3. 每次后续运行时,仅列出路径 在当前运行之前、初始运行结束时间之后以及当前运行期间(当前运行开始时间和当前运行结束时间之间)创建

知道如何做到这一点吗?我只是想澄清一下,我不是在“监视/监视”该目录,而是时不时地访问它。

最佳答案

这是一个非常基本的结构思想:每个文件夹都有自己的线程。您将有 2 个类,一个用于收集数据“directoryHelper”,另一个用于存储数据“Directory”。

需要两个类,因为一个线程只能启动一次,并且您需要能够为已列出的目录生成新线程而不丢失其数据。

根目录将是一个列出其给定路径('C:\mydocs')的 Directory 实例。它将文件列表存储在 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 个文件

关于python - 更新快速变化的目录中的文件路径列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18835738/

相关文章:

python - 如何读取大文件(套接字编程和python)?

python - 转换为 Python 2.7 后图像服务出现错误

python - 错误文件未打开以供读取

针对 REGEXP 的 Mysql 优化

java - 如何在 Java Lucene 6.2.0 中创建索引和搜索查询

authentication - 热门网站如何允许您从 Facebook 等其他网站登录?

algorithm - 有没有更好的方法来查找搜索引擎代码的集合交集?

python - 从目录中的多个文本文件加载停用词

random - 从 Google 表格列表中选择随机单元格的简单方法

python - numpy 字符串数组索引行为