鱼C论坛

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

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

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

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

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

x
本帖最后由 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)[1]  # 返回的是元组,获取文件的后缀名=ext
        type_dict.setdefault(ext, 0)
        type_dict[ext] += 1

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

课后作业 第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[each_file]))

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)[1]
            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()



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

[/b]
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[2]:           
            print('文件名字 【%s】 。' % each_file)   
            if os.path.splitext(each_file)[1] == '.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: [Errno 2] 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
想知道小甲鱼最近在做啥?请访问 -> 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题,请楼主参考一二,加油|奥利给!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-11 19:01:15 From FishC Mobile | 显示全部楼层
第三题,if 后面的or连接的是每一个表达式,表达式判断true才会往下执行
想知道小甲鱼最近在做啥?请访问 -> 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':
想知道小甲鱼最近在做啥?请访问 -> 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':

是的,第二题,递归调用不返回上一层,那它就无限递归下去,会内存泄露
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-27 06:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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