(一)os.walk库的简单实现
1:walk实现广度遍历
# 广度遍历
import os
def walk(path=None):
if path is None:
path = '.'
dirs = [path]
files = []
while dirs:
path = dirs.pop(0)
for f in os.listdir(path): # 遍历所有的文件的文件名,不是路径
f = os.path.join(path, f)
if os.path.isdir(f):
dirs.append(f)
else:
files.append(f)
return files
print(walk('.'))
# 广度遍历思想小结:walk函数接收的参数为一个路径,通过创建dirs这个栈,将路径先压栈,然后再将路径出栈,通过os.scandir()方法遍历路径,判断如果文件变量为目录的话,压栈到stack,如果文件变量为文件的话,添加到files列表。这样通过dirs.pop(0)对目录一层一层的将文件添加到files列表内部,最后返回这个files列表。思想是:先收集第一层的所有的文件,再收集第二层的所有的文件
2:walk实现深度遍历
# 深度遍历
import os
def walk(root):
stack = [root]
files = []
while stack:
cur = stack.pop()
for x in os.scandir(cur): # 遍历一个可迭代对象
if x.is_dir():
stack.append(x.path)
else:
files.append(x.path)
return files
print(walk('.'))
# 深度遍历思想小结:感觉深度变量的思想与广度变量的思想一致,也是先变量第一层,将文件先append到列表中,将目录压栈。出栈的目录里面如果有目录再次压栈,那么就是先将一个目录的所有文件先遍历了,将一个目录的文件先append到files列表中,再变量另外一个目录中的所有文件
(二)tail -f的简单实现
import time
import threading
def tailf(path):
offset = 0
event = threading.Event()
try:
while not event.is_set():
with open(path) as f:
if offset > os.stat(path).st_size:
offset = 0
f.seek(offset)
for line in f:
yield line # 返回的是一个生成器
offset = f.tell()
time.sleep(1)
except KeyboardInterrupt:
event.set()
for x in tailf('/Users/yinhuanyi/PycharmProjects/Python学习笔记/第一天/partial的实现.py'):
print(x)