import osos.walk(specify_dir)
os.walk 返回一个生成器对象,
返回元素结构为: [完整路径, [当前完整路径下含有的子目录], [当前完整路径下所有的文件]]
通过不断遍历 os.walk 可以得到当前目录下的所有文件夹,与子文件
第一个元素打印的是 根目录, 下一个元素即为 根目录+子目录 , 依此类推,将所有子目录进行一个完整遍历, 不需要使用递归
错误代码示范
编写程序usr_max.py, 找出指定的目录(如/etc)文本之最:
最多行的文件是:
字符串最多的文件是:
最多被使用的单词是:
出现的最长的单词是:
#!/usr/bin/python3# coding = utf-8# 该文件写的有问题, 需要进行修改import osimport refrom collections import Counterdata = []def get_result(file_name):"""返回 文件的 字符串的数量 最多被使用的单词 出现最长的单词"""try:with open(file_name, mode="r", encoding="utf-8") as f:file_content = f.read()except:# 这里报错说明不是文本文件return [0, 0, ("", 0), 0]# 获取全部字符串列表all_ = re.findall('[a-z]+', file_content)if len(all_) == 0:return [0, 0, ("", 0), 0]# 获取出现最多的字符串max_string = Counter(all_).most_common(1)max_string = max_string[0] if len(max_string) != 0 else ("", 0)# 获取最长的字符串sort_all = sorted(all_, key=lambda x:len(x), reverse=True)max_leng = sort_all[0] if len(sort_all) != 0 else ""return [file_content.count('\n'), len(all_), max_string, max_leng]def recursion(file_path):"""利用 os walk + 递归 遍历所有文件夹"""# 使用全局变量global datafor i in os.walk(file_path):# 提取下一级目录for next_dir in i[1]:recursion(i[0] + '/' +next_dir)for cur_file_name in i[2]:final_file_name = i[0] + '/' + cur_file_nameresult = get_result(final_file_name)if result[1] != 0:# 这里做一下筛选, 没有单词的就不要入库了, 浪费空间data.append([final_file_name, result])def main():file_path = input("请输入目录名称")# file_path = '/etc'recursion(file_path)if len(data) == 0:print("发生错误, 该目录下并没有找到任何文本文件")return# 编写比较代码# print(data)# 比较行数res = sorted(data, key=lambda x:x[1][0], reverse=False)[-1]print("最多行的文件是: %s, 共有 %d 行" % (res[0], res[1][0]))# 获取单词数量res = sorted(data, key=lambda x: x[1][1], reverse=False)[-1]print("字符串最多的文件: %s, 共有: %d 个字符串" % (res[0], res[1][1]))# print(res)# 最多被使用的单词max_count = {}for i in data:if i[1][2][0] in max_count:max_count[i[1][2][0]] += i[1][2][1]else:max_count[i[1][2][0]] = i[1][2][1]max_count_list = list(max_count.items())max_count_list.sort(key=lambda x:x[1])# print(max_count_list)print("最多被使用的单词是: %s" % max_count_list[-1][0])# 出现的最长单词res = sorted(data, key=lambda x:len(x[1][3]), reverse=False)[-1]print("出现的最长的单词: %s" % res[1][3])if __name__ == '__main__':main()# s = get_result('/etc/pam.conf')# print(s)
错误分析: 因为使用者错误理解 os.walk 的用法 , 导致使用递归 去遍历该文件夹, 性能出现重大延时, 结果也不正确, 因为多遍历了一次文件夹
正确写法
def recursion(file_path):"""利用 os walk + 递归 遍历所有文件夹"""# 使用全局变量global datafor i in os.walk(file_path):for cur_file_name in i[2]:final_file_name = i[0] + '/' + cur_file_nameresult = get_result(final_file_name)if result[1] != 0:# 这里做一下筛选, 没有单词的就不要入库了, 浪费空间data.append([final_file_name, result])
