1. import os
    2. os.walk(specify_dir)

    os.walk 返回一个生成器对象,
    返回元素结构为: [完整路径, [当前完整路径下含有的子目录], [当前完整路径下所有的文件]]
    通过不断遍历 os.walk 可以得到当前目录下的所有文件夹,与子文件

    第一个元素打印的是 根目录, 下一个元素即为 根目录+子目录 , 依此类推,将所有子目录进行一个完整遍历, 不需要使用递归

    错误代码示范

    编写程序usr_max.py, 找出指定的目录(如/etc)文本之最:
    最多行的文件是:
    字符串最多的文件是:
    最多被使用的单词是:
    出现的最长的单词是:

    1. #!/usr/bin/python3
    2. # coding = utf-8
    3. # 该文件写的有问题, 需要进行修改
    4. import os
    5. import re
    6. from collections import Counter
    7. data = []
    8. def get_result(file_name):
    9. """返回 文件的 字符串的数量 最多被使用的单词 出现最长的单词"""
    10. try:
    11. with open(file_name, mode="r", encoding="utf-8") as f:
    12. file_content = f.read()
    13. except:
    14. # 这里报错说明不是文本文件
    15. return [0, 0, ("", 0), 0]
    16. # 获取全部字符串列表
    17. all_ = re.findall('[a-z]+', file_content)
    18. if len(all_) == 0:
    19. return [0, 0, ("", 0), 0]
    20. # 获取出现最多的字符串
    21. max_string = Counter(all_).most_common(1)
    22. max_string = max_string[0] if len(max_string) != 0 else ("", 0)
    23. # 获取最长的字符串
    24. sort_all = sorted(all_, key=lambda x:len(x), reverse=True)
    25. max_leng = sort_all[0] if len(sort_all) != 0 else ""
    26. return [file_content.count('\n'), len(all_), max_string, max_leng]
    27. def recursion(file_path):
    28. """利用 os walk + 递归 遍历所有文件夹"""
    29. # 使用全局变量
    30. global data
    31. for i in os.walk(file_path):
    32. # 提取下一级目录
    33. for next_dir in i[1]:
    34. recursion(i[0] + '/' +next_dir)
    35. for cur_file_name in i[2]:
    36. final_file_name = i[0] + '/' + cur_file_name
    37. result = get_result(final_file_name)
    38. if result[1] != 0:
    39. # 这里做一下筛选, 没有单词的就不要入库了, 浪费空间
    40. data.append([final_file_name, result])
    41. def main():
    42. file_path = input("请输入目录名称")
    43. # file_path = '/etc'
    44. recursion(file_path)
    45. if len(data) == 0:
    46. print("发生错误, 该目录下并没有找到任何文本文件")
    47. return
    48. # 编写比较代码
    49. # print(data)
    50. # 比较行数
    51. res = sorted(data, key=lambda x:x[1][0], reverse=False)[-1]
    52. print("最多行的文件是: %s, 共有 %d 行" % (res[0], res[1][0]))
    53. # 获取单词数量
    54. res = sorted(data, key=lambda x: x[1][1], reverse=False)[-1]
    55. print("字符串最多的文件: %s, 共有: %d 个字符串" % (res[0], res[1][1]))
    56. # print(res)
    57. # 最多被使用的单词
    58. max_count = {}
    59. for i in data:
    60. if i[1][2][0] in max_count:
    61. max_count[i[1][2][0]] += i[1][2][1]
    62. else:
    63. max_count[i[1][2][0]] = i[1][2][1]
    64. max_count_list = list(max_count.items())
    65. max_count_list.sort(key=lambda x:x[1])
    66. # print(max_count_list)
    67. print("最多被使用的单词是: %s" % max_count_list[-1][0])
    68. # 出现的最长单词
    69. res = sorted(data, key=lambda x:len(x[1][3]), reverse=False)[-1]
    70. print("出现的最长的单词: %s" % res[1][3])
    71. if __name__ == '__main__':
    72. main()
    73. # s = get_result('/etc/pam.conf')
    74. # print(s)

    错误分析: 因为使用者错误理解 os.walk 的用法 , 导致使用递归 去遍历该文件夹, 性能出现重大延时, 结果也不正确, 因为多遍历了一次文件夹

    正确写法

    1. def recursion(file_path):
    2. """利用 os walk + 递归 遍历所有文件夹"""
    3. # 使用全局变量
    4. global data
    5. for i in os.walk(file_path):
    6. for cur_file_name in i[2]:
    7. final_file_name = i[0] + '/' + cur_file_name
    8. result = get_result(final_file_name)
    9. if result[1] != 0:
    10. # 这里做一下筛选, 没有单词的就不要入库了, 浪费空间
    11. data.append([final_file_name, result])