鱼C论坛

 找回密码
 立即注册
查看: 865|回复: 4

第三十课:文件系统 课后作业有几个地方不明白求解答

[复制链接]
发表于 2020-5-10 16:13:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 seasonpilot 于 2020-5-13 23:27 编辑

第三十课:文件系统:介绍一个高大上的东西


课后作业 第0题,请问为什么我统计文件夹数量时,不能输出‘文件夹’?‘类型为’后面里面是空白。如下:
该文件夹下共有类型为【】的文件 4 个


  1. import os

  2. all_files = os.listdir(os.curdir)  # 使用os.curdir表示当前目录更标准
  3. type_dict = dict()  # 先定一个空字典来存放{'后缀名': 数量}

  4. for each_file in all_files:
  5.     if os.path.isdir(each_file):
  6.         type_dict.setdefault('文件夹', 0)  # 当原字典中无该键时,则新增该键和对于的值,并返回键值
  7.         type_dict['文件夹'] += 1
  8.     else:
  9.         ext = os.path.splitext(each_file)[1]  # 返回的是元组,获取文件的后缀名=ext
  10.         type_dict.setdefault(ext, 0)
  11.         type_dict[ext] += 1

  12. for each_type in type_dict.keys():
  13.     print('该文件夹下共有类型为【%s】的文件 %d 个' % (each_type, type_dict[each_type]))
复制代码


课后作业 第1题   无法计算桌面内的文件大小,运行代码后没有 反应

  1. import os

  2. def file_size():
  3.     file_name = os.listdir(os.curdir)
  4.     dict1 = dict()

  5.     for each_file in file_name:
  6.         if os.path.isfile(each_file):
  7.             dict1.setdefault(each_file, os.path.getsize(each_file))
  8.             print('%s的大小为:【%d Bytes】' % (each_file, dict1[each_file]))

  9. file_size()
复制代码


课后作业 第2题   为什么“递归调用后切记返回上一层目录”?

  1. import os

  2. def search_file(start_dir, target):
  3.     os.chdir(start_dir)  # 切换当前工作目录

  4.     for each_file in os.listdir(os.curdir):
  5.         if each_file == target:
  6.             print(os.getcwd() + os.sep + each_file)  # 使用os.sep使程序更标准
  7.         if os.path.isdir(each_file):
  8.             search_file(each_file, target)  # 递归调用
  9.             os.chdir(os.pardir)  # 递归调用后切记返回上一层目录

  10. start_dir = input('请输入待查找的初始目录:')
  11. target = input('请输入需要查找的目标文件:')
  12. search_file(start_dir, target)
复制代码



课后作业 第3题    第10行代码  为啥写成   if file_ext == '.mp4' or '.rmvb' or '.avi':    就是错的?

  1. import os

  2. vedio_list = []

  3. def search_file(start_dir):
  4.     os.chdir(start_dir)
  5.     for each_file in os.listdir(os.curdir):
  6.         if os.path.isfile(each_file):
  7.             file_ext = os.path.splitext(each_file)[1]
  8.             if file_ext in ['.mp4', '.rmvb', '.avi']:
  9.                 vedio_list.append(os.getcwd() + os.sep + each_file + os.linesep)
  10.         if os.path.isdir(each_file):
  11.             search_file(each_file)  # 递归调用
  12.             os.chdir(os.pardir)  # 递归调用后切记返回上一层目录
  13.     return vedio_list

  14. start_dir = input('请输入待查找的初始目录:')
  15. vedio_list = search_file(start_dir)
  16. f = open(os.getcwd() + os.sep + 'VedioList.txt', 'w')
  17. f.writelines(vedio_list)
  18. f.close()
复制代码




[b]课后作业 第4题   当前文件夹的文件可以打开,子目录下的文件打不开 是什么原因啊?  看了白度的方法,都没有解决。这个文件实际是有的
后面调试了几次,发现子目录名称改为非 ‘新建文件夹’  的名称可以正常运行,但是改了文本文档名称就不能正常运行,再改回 ‘新建文本文档’ 就可以正常运行

[/b]

  1. import os

  2. def seach_keyword(keyword, count):
  3.     file = os.walk(os.curdir)
  4.     print('所有文件 %s 。' % file)
  5.     for i in file:                       
  6.         print('fafasfafsa', i)
  7.         for each_file in i[2]:           
  8.             print('文件名字 【%s】 。' % each_file)   
  9.             if os.path.splitext(each_file)[1] == '.txt':         
  10.                 f = open(each_file, 'r')
  11.                 for each_line in f:
  12.                     count += 1
  13.                     if keyword in each_line:
  14.                         pos = each_line.find(keyword)
  15.                         print('关键字出现在第 %s 行,第 %s 个位置。' % (count, pos))

  16. keyword = input('请输入关键字')
  17. count = 0  # 计数器
  18. seach_keyword(keyword, count)
复制代码



运行打印如下:
  1. C:\Users\Administrator\AppData\Local\Programs\Python\Python38\python.exe "C:/Users/Administrator/Desktop/练习/代码练习/30 文件系统/4. 编写一个程序,用户输入关键字,查找当前文件夹内(如果当前文件夹内包含文件夹,则进入文件夹继续搜索)所有含有该关键字的文本文件(.txt后缀),要求显示该文件所在的位置以及关键字在文件中的具体位置(第几行第几个字符)/好极了.py"
  2. 请输入关键字f
  3. 所有文件 <generator object walk at 0x00000000021297B0> 。
  4. fafasfafsa ('.', ['.idea', '232', '哈哈'], ['好极了.py', '新建文.txt', '新建文本文档.txt', '查找含有该关键字的文本文件 - 2.py', '查找含有该关键字的文本文件(参考答案).py', '查找含有该关键字的文本文件.py'])
  5. 文件名字 【好极了.py】 。
  6. 文件名字 【新建文.txt】 。
  7. 关键字出现在第 1 行,第 0 个位置。
  8. 关键字出现在第 2 行,第 0 个位置。
  9. 关键字出现在第 3 行,第 0 个位置。
  10. 关键字出现在第 4 行,第 0 个位置。
  11. 关键字出现在第 5 行,第 0 个位置。
  12. 关键字出现在第 6 行,第 0 个位置。
  13. 关键字出现在第 7 行,第 1 个位置。
  14. 关键字出现在第 9 行,第 0 个位置。
  15. 关键字出现在第 10 行,第 0 个位置。
  16. 关键字出现在第 11 行,第 0 个位置。
  17. 关键字出现在第 12 行,第 2 个位置。
  18. 关键字出现在第 14 行,第 0 个位置。
  19. 关键字出现在第 15 行,第 1 个位置。
  20. 关键字出现在第 16 行,第 0 个位置。
  21. 关键字出现在第 18 行,第 0 个位置。
  22. 文件名字 【新建文本文档.txt】 。
  23. 关键字出现在第 19 行,第 0 个位置。
  24. 关键字出现在第 20 行,第 0 个位置。
  25. 关键字出现在第 21 行,第 1 个位置。
  26. 关键字出现在第 23 行,第 0 个位置。
  27. 关键字出现在第 24 行,第 0 个位置。
  28. 关键字出现在第 25 行,第 0 个位置。
  29. 文件名字 【查找含有该关键字的文本文件 - 2.py】 。
  30. 文件名字 【查找含有该关键字的文本文件(参考答案).py】 。
  31. 文件名字 【查找含有该关键字的文本文件.py】 。
  32. Traceback (most recent call last):
  33.   File "C:/Users/Administrator/Desktop/练习/代码练习/30 文件系统/4. 编写一个程序,用户输入关键字,查找当前文件夹内(如果当前文件夹内包含文件夹,则进入文件夹继续搜索)所有含有该关键字的文本文件(.txt后缀),要求显示该文件所在的位置以及关键字在文件中的具体位置(第几行第几个字符)/好极了.py", line 28, in <module>
  34.     seach_keyword(keyword, count)
  35.   File "C:/Users/Administrator/Desktop/练习/代码练习/30 文件系统/4. 编写一个程序,用户输入关键字,查找当前文件夹内(如果当前文件夹内包含文件夹,则进入文件夹继续搜索)所有含有该关键字的文本文件(.txt后缀),要求显示该文件所在的位置以及关键字在文件中的具体位置(第几行第几个字符)/好极了.py", line 15, in seach_keyword
  36.     f = open(each_file, 'r')
  37. FileNotFoundError: [Errno 2] No such file or directory: '法.txt'
  38. fafasfafsa ('.\\.idea', ['inspectionProfiles'], ['.gitignore', '4. 编写一个程序,用户输入关键字,查找当前文件夹内(如果当前文件夹内包含文件夹,则进入文件夹继续搜索)所有含有该关键字的文本文件(.txt后缀),要求显示该文件所在的位置以及关键字在文件中的具体位置(第几行第几个字符).iml', 'misc.xml', 'modules.xml', 'workspace.xml'])
  39. 文件名字 【.gitignore】 。
  40. 文件名字 【4. 编写一个程序,用户输入关键字,查找当前文件夹内(如果当前文件夹内包含文件夹,则进入文件夹继续搜索)所有含有该关键字的文本文件(.txt后缀),要求显示该文件所在的位置以及关键字在文件中的具体位置(第几行第几个字符).iml】 。
  41. 文件名字 【misc.xml】 。
  42. 文件名字 【modules.xml】 。
  43. 文件名字 【workspace.xml】 。
  44. fafasfafsa ('.\\.idea\\inspectionProfiles', [], ['profiles_settings.xml'])
  45. 文件名字 【profiles_settings.xml】 。
  46. fafasfafsa ('.\\232', [], ['法.txt'])
  47. 文件名字 【法.txt】 。

  48. Process finished with exit code 1
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-5-11 17:51:43 | 显示全部楼层
本帖最后由 AK;LJSDGVL.KSDF 于 2020-5-11 22:24 编辑

回答第一个问题:因为 if os.path.isdir(each_file):从来没执行,程序只下一个判断执行
os.path.isdir(each_file)的注释:isdir(path)  判断指定路径是否存在且是一个目录  ,注意path是一个绝对路径,因此原来的程序,传入的each_file是错的,可改为
path = os.curdir + '\\' + each_file  #建立绝对路径
if os.path.isdir(path):                    #传入绝对路径

本人小白,不喜勿喷,现在只到第0题,请楼主参考一二,加油|奥利给!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-11 19:01:15 From FishC Mobile | 显示全部楼层
第三题,if 后面的or连接的是每一个表达式,表达式判断true才会往下执行
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-11 19:44:01 | 显示全部楼层
jkluoling1992 发表于 2020-5-11 19:01
第三题,if 后面的or连接的是每一个表达式,表达式判断true才会往下执行

明白了,应该这样写
if file_ext == '.mp4' or  file_ext == '.rmvb' or  file_ext =='.avi':
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-11 22:13:36 From FishC Mobile | 显示全部楼层
seasonpilot 发表于 2020-5-11 19:44
明白了,应该这样写
if file_ext == '.mp4' or  file_ext == '.rmvb' or  file_ext =='.avi':

是的,第二题,递归调用不返回上一层,那它就无限递归下去,会内存泄露
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-20 09:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表