seasonpilot 发表于 2020-5-10 16:13:29

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

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

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


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

import os

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

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

for each_type in type_dict.keys():
    print('该文件夹下共有类型为【%s】的文件 %d 个' % (each_type, type_dict))

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

import os

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

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

file_size()

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

import os

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

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

start_dir = input('请输入待查找的初始目录:')
target = input('请输入需要查找的目标文件:')
search_file(start_dir, target)



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

import os

vedio_list = []

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

start_dir = input('请输入待查找的初始目录:')
vedio_list = search_file(start_dir)
f = open(os.getcwd() + os.sep + 'VedioList.txt', 'w')
f.writelines(vedio_list)
f.close()



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



import os

def seach_keyword(keyword, count):
    file = os.walk(os.curdir)
    print('所有文件 %s 。' % file)
    for i in file:                     
      print('fafasfafsa', i)
      for each_file in i:         
            print('文件名字 【%s】 。' % each_file)   
            if os.path.splitext(each_file) == '.txt':         
                f = open(each_file, 'r')
                for each_line in f:
                  count += 1
                  if keyword in each_line:
                        pos = each_line.find(keyword)
                        print('关键字出现在第 %s 行,第 %s 个位置。' % (count, pos))

keyword = input('请输入关键字')
count = 0# 计数器
seach_keyword(keyword, count)



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

Process finished with exit code 1

AK;LJSDGVL.KSDF 发表于 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题,请楼主参考一二,加油|奥利给!

jkluoling1992 发表于 2020-5-11 19:01:15

第三题,if 后面的or连接的是每一个表达式,表达式判断true才会往下执行

seasonpilot 发表于 2020-5-11 19:44:01

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

明白了,应该这样写
if file_ext == '.mp4' orfile_ext == '.rmvb' orfile_ext =='.avi':

jkluoling1992 发表于 2020-5-11 22:13:36

seasonpilot 发表于 2020-5-11 19:44
明白了,应该这样写
if file_ext == '.mp4' orfile_ext == '.rmvb' orfile_ext =='.avi':

是的,第二题,递归调用不返回上一层,那它就无限递归下去,会内存泄露
页: [1]
查看完整版本: 第三十课:文件系统 课后作业有几个地方不明白求解答