【问题标题】:limit no of filepaths using os.walk where huge files in a directory使用 os.walk 限制文件路径的数量,其中目录中的大文件
【发布时间】:2017-02-23 02:06:58
【问题描述】:

我有一个应用程序。一种允许目录路径并使用 os.walk 返回给定目录下的文件路径列表的方法

我想在没有大量文件并存储在队列中的目录中读取某些文件(一些阈值,例如带 20 个文件路径)。在这里我可以检查文件路径及其在数据库中的状态。

下次我在同一个目录调用同一个方法时,它应该通过排除已经返回的文件路径来返回下一组文件路径。

场景: 假设,D:/Sample_folder 有 1000 个文件。

my_dir = "D:/Sample_folder"

def read_files(目录): 文件路径 = []

for root, directories, files in os.walk(directory):
    for filename in files:
        file_path = os.path.join(root, filename)
        file_paths.append(file_path)

return file_paths 

read_files(my_dir) == 这将在第一轮给出前 100 个文件 下一回合,它应该提供剩余的 100 个文件 就这样……

对此的任何想法或示例脚本。

【问题讨论】:

  • 所以你想要一个列表队列,每个列表有 100 个文件路径?
  • 是的,每次我应该通过排除已经返回的路径来获得 100 条不同的路径。没有队列,我需要一个方法应该返回一个路径列表。稍后我会将这些列表项保留在队列中以进行其他计算。
  • 您的my_dir 是否有子目录,还是只是一个包含 1000 个文本文件的平面目录?
  • 也可以有子目录

标签: python queue filepath os.walk


【解决方案1】:

假设您已经填充了files,应该这样做。

import Queue

paths = Queue.Queue()

current_list = []

for i, path in enumerate(files):

    # Second case to make sure we dont add a blank list
    if i % 100 == 0 and i != 0:
        paths.put(current_list)
        current_list = []

    current_list.append(path)

【讨论】:

    【解决方案2】:

    编辑:

    这是一个使用类的可能解决方案,但它不会添加太多代码。主要思想是每次访问元素时弹出一个元素。所以工作流程是创建一个FileListIter 对象,然后在其上调用.next() 以返回下一个要处理的100 文件的列表,然后对象会忘记它们。您可以致电.has_next() 检查您是否没有文件。如果您将参数传递给下一个参数,例如 .next(2),那么它将返回列表中的前 2 个文件。

    代码:

    import os
    
    class FileListIter(object):
        #Initialize the files
        def __init__(self,directory):
            file_paths = []
            for root, directories, files in os.walk(directory):
                for filename in files:
                    file_path = os.path.join(root, filename)
                    file_paths.append(file_path)
    
            self.files = file_paths
    
        #When called w/out args give back the first 100 files, otherwise the first n
        def next(self,n=100):
            ret,self.files = self.files[:n],self.files[n:]
            return ret
    
        #Check if there are any files left
        def has_next(self):
            return len(self.files) > 0
    
    d = '/home/rob/stack_overflow'
    files_gen = FileListIter(d) #<-- this makes an object
    
    while files_gen.has_next():
        file_subset = files_gen.next(2)
        print file_subset
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-12
      • 1970-01-01
      • 2013-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-03
      相关资源
      最近更新 更多