我有一个申请。一种允许目录路径并使用os.walk
返回给定目录下的文件路径列表的方法我想在一个目录中读取某些文件(某些阈值,如带来20个文件路径),这个目录中有大量没有文件和存储在Queue中。在这里,我可以检查文件路径及其在数据库中的状态。
下次当我使用相同的目录调用相同的方法时,它应该通过排除已经返回的文件路径来返回下一组文件路径。
方案: 让我们假设,D:/ Sample_folder有1000个文件。
my_dir =“D:/ Sample_folder”
def read_files(目录): 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)
return file_paths
read_files(my_dir)==这将在第一轮中给出前100个文件 接下来,它应该给出剩余的100个文件 像这样...
任何想法或示例脚本。
答案 0 :(得分:0)
假设您已填充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)
答案 1 :(得分:0)
编辑:
这是一个使用类的可能解决方案,但它不会添加很多代码。主要思想是每次访问元素时弹出一个元素。因此工作流程是创建一个FileListIter
对象,然后在其上调用.next()
以返回下一个100
文件的列表以执行某些操作,然后对象会忘记它们。您可以致电.has_next()
查看您是否已退出文件。如果您将参数传递给下一个.next(2)
,那么它将返回列表中的前两个文件。
CODE:
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