import os
os.walk(specify_dir)
os.walk 返回一个生成器对象,
返回元素结构为: [完整路径, [当前完整路径下含有的子目录], [当前完整路径下所有的文件]]
通过不断遍历 os.walk 可以得到当前目录下的所有文件夹,与子文件
第一个元素打印的是 根目录, 下一个元素即为 根目录+子目录 , 依此类推,将所有子目录进行一个完整遍历, 不需要使用递归
错误代码示范
编写程序usr_max.py, 找出指定的目录(如/etc)文本之最:
最多行的文件是:
字符串最多的文件是:
最多被使用的单词是:
出现的最长的单词是:
#!/usr/bin/python3
# coding = utf-8
# 该文件写的有问题, 需要进行修改
import os
import re
from collections import Counter
data = []
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 data
for 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_name
result = 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 data
for i in os.walk(file_path):
for cur_file_name in i[2]:
final_file_name = i[0] + '/' + cur_file_name
result = get_result(final_file_name)
if result[1] != 0:
# 这里做一下筛选, 没有单词的就不要入库了, 浪费空间
data.append([final_file_name, result])