使用Python,如何基于对文件系统的搜索获得文件信息对象数组?

使用Python,如何基于对文件系统的搜索获得文件信息对象数组?,python,find,fileinfo,Python,Find,Fileinfo,目前我有一个bash脚本,它运行find命令,如下所示: find /storage/disk-1/Media/Video/TV -name *.avi -mtime -7 这将获取过去7天内添加到我的系统中的电视节目列表。然后我继续创建一些符号链接,这样我就可以看到我最新的电视节目了 我想用Python重新编写代码,但我有几个问题似乎可以找到使用Google的答案(也许我没有搜索正确的东西)。我认为总结这一点的最佳方式是提出以下问题: 我如何在我的文件系统上执行搜索(我应该调用find?),

目前我有一个bash脚本,它运行
find
命令,如下所示:

find /storage/disk-1/Media/Video/TV -name *.avi -mtime -7
这将获取过去7天内添加到我的系统中的电视节目列表。然后我继续创建一些符号链接,这样我就可以看到我最新的电视节目了

我想用Python重新编写代码,但我有几个问题似乎可以找到使用Google的答案(也许我没有搜索正确的东西)。我认为总结这一点的最佳方式是提出以下问题:

我如何在我的文件系统上执行搜索(我应该调用
find
?),它为我提供一个文件信息对象数组(包含修改日期、文件名等),以便我可以根据日期和其他类似内容对它们进行排序?

  • 您可以通过“子流程”模块使用“查找”
  • 然后,使用“split”字符串函数剖析每一行
  • 对于每个文件,使用操作系统模块(例如getmtime等)获取文件信息

  • 使用“walk”和“glob”模块获取对象中的文件路径
      • 您可以通过“子流程”模块使用“查找”
      • 然后,使用“split”字符串函数剖析每一行
      • 对于每个文件,使用操作系统模块(例如getmtime等)获取文件信息

      • 使用“walk”和“glob”模块获取对象中的文件路径

      查看模块os:os.walk是遍历文件系统的函数,os.path是提供文件mtime和其他文件信息的模块。此外,os.path还定义了许多用于解析和拆分文件名的函数

      同样令人感兴趣的是,模块glob为“globbing”字符串定义了一个函数(使用unix通配符规则匹配字符串)


      因此,构建一个符合某些标准的文件列表应该很容易

      查看模块os:os.walk是遍历文件系统的函数,os.path是提供文件mtime和其他文件信息的模块。此外,os.path还定义了许多用于解析和拆分文件名的函数

      import os, time
      
      allfiles = []
      now = time.time()
      
      # walk will return triples (current dir, list of subdirs, list of regular files)
      # file names are relative to dir at first
      for dir, subdirs, files in os.walk("/storage/disk-1/Media/Video/TV"):
          for f in files:
              if not f.endswith(".avi"):
                  continue
              # compute full path name
              f = os.path.join(dir, f)
              st = os.stat(f)
              if st.st_mtime < now - 3600*24*7:
                  # too old
                  continue
              allfiles.append((f, st))
      
      同样令人感兴趣的是,模块glob为“globbing”字符串定义了一个函数(使用unix通配符规则匹配字符串)

      因此,构建一个符合某些标准的文件列表应该很容易

      导入操作系统,时间
      
      import os, time
      
      allfiles = []
      now = time.time()
      
      # walk will return triples (current dir, list of subdirs, list of regular files)
      # file names are relative to dir at first
      for dir, subdirs, files in os.walk("/storage/disk-1/Media/Video/TV"):
          for f in files:
              if not f.endswith(".avi"):
                  continue
              # compute full path name
              f = os.path.join(dir, f)
              st = os.stat(f)
              if st.st_mtime < now - 3600*24*7:
                  # too old
                  continue
              allfiles.append((f, st))
      
      所有文件=[] now=time.time() #walk将返回三元组(当前目录、子目录列表、常规文件列表) #文件名首先是相对于dir的 对于os.walk(“/storage/disk-1/Media/Video/TV”)中的目录、子目录和文件: 对于文件中的f: 如果不是f.endswith(“.avi”): 持续 #计算完整路径名 f=os.path.join(dir,f) st=操作系统状态(f) 如果st.st_mtime<现在-3600*24*7: #太老了 持续 allfiles.append((f,st))
      这将以成对列表(文件名、统计结果)的形式返回所有查找到的文件。

      导入操作系统,时间
      所有文件=[]
      now=time.time()
      #walk将返回三元组(当前目录、子目录列表、常规文件列表)
      #文件名首先是相对于dir的
      对于os.walk(“/storage/disk-1/Media/Video/TV”)中的目录、子目录和文件:
      对于文件中的f:
      如果不是f.endswith(“.avi”):
      持续
      #计算完整路径名
      f=os.path.join(dir,f)
      st=操作系统状态(f)
      如果st.st_mtime<现在-3600*24*7:
      #太老了
      持续
      allfiles.append((f,st))
      

      这将以成对列表(filename,stat result)的形式返回所有find也返回的文件。

      不过,现在他需要问自己,除了“很酷”之外,为什么还需要用python编写此代码。python比bash脚本更具可读性,可能更高效、更强大。此外,您可以使用python构建一个完整的应用程序:在他的例子中,他可能希望将搜索与GUI结合起来,以用户友好的方式呈现最后的节目。他已经说过:他现在想要创建符号链接。在纯shell中,这可能会变得单调乏味。因为在shell脚本中编写任何复杂的代码都是一种挫败感和由错误转义的文本导致的奇怪错误的练习?然而,现在他需要问自己,除了“很酷”之外,为什么还要用python编写此代码python比bash脚本更具可读性,并且可能更高效、更强大。此外,您可以使用python构建一个完整的应用程序:在他的例子中,他可能希望将搜索与GUI结合起来,以用户友好的方式呈现最后的节目。他已经说过:他现在想要创建符号链接。在纯shell中,这可能会变得单调乏味。因为在shell脚本中编写任何复杂的代码都是一种挫败感和由错误转义的文本导致的奇怪错误的练习?在不必要的情况下运行子流程效率低下。这里的Glob也没有效率,因为它需要在每个目录上执行两倍的操作(一次用于漫游,然后第二次用于Glob)。我没有感觉到需要在这里进行太多优化。在不需要的时候运行子流程效率很低。这里的Glob也不是很有效,因为它需要在每个目录上执行两倍的操作(一次用于漫游,然后第二次用于Glob)。我没有感觉到这里需要做那么多优化。关于这个示例,有趣的是,时间是从搜索开始时开始的,因此,如果搜索文件系统的时间超过7天,7天后将不会返回任何文件。(可能不是7天内的问题,而是您希望所有文件都不超过7分钟。)@simsong:如果搜索需要很长时间,那么仅仅通过遍历文件系统是不可能得到正确的结果的。如果您假定在搜索仍处于p状态时创建了新文件