[学习笔记] 【Pyhon 第030讲:文件系统总结】

0. 编写一个程序,统计当前目录下每个文件类型的文件数。

9

代码清单:

import os  #导入os模块

all_files = os.listdir(os.curdir) #listdir列出当前目录所有文件名,curdir指定当前目录
type_dict = dict()

for each_file in all_files:
    if os.path.isdir(each_file): #判断指定路径是否存在且是一个目录
        type_dict.setdefault('文件夹', 0) #如果键不存在于字典中,将会添加键并将值设置为0
        type_dict['文件夹'] += 1 #统计当前目录下文件夹个数
    else:
        ext = os.path.splitext(each_file)[1]#等ext于这个元组中的第二个元素,即ext是扩展名
        type_dict.setdefault(ext, 0)
        type_dict[ext] += 1

for each_type in type_dict.keys(): #each_type等于字典type_dict返回的键,在这里是文件夹或扩展名
    print('该文件夹下共有类型为【%s】的文件 %d 个' % (each_type, type_dict[each_type]))



#思路分析:
1、把指针指定在当前目录,列出所有目录下的文件名;用dict()函数创建一个字典,赋值给type_dict。
2、for循环遍历当前目录所有文件名,判断当前文件是否是文件夹:
         是:创建字典默认值,并且字典里唯一的键(key)‘文件夹’的值'0'自增1,此步骤用于统计文件夹数量。
         否:用splittext分离文件名和后缀名,把后缀名指定给ext变量,创建字典默认值,ext(后缀名=文件类型)对应键的值自增1,此步骤用于统计文件类型数量。
3、for循环遍历type_dict的键,打印出来键和键所对应的值。

 

1. 编写一个程序,计算当前文件夹下所有文件的大小。

&58Iqs$g"
G|C1k=+#)w2Jz3X}L*W F?&>ve0I6
代码清单:

import os

all_files = os.listdir(os.curdir) #列举指定目录中的文件名,os.curdir表示当前目录
type_dict = dict()

for each_file in all_files:
    if os.path.isfile(each_file): #for循环遍历当前目录所有文件名,判断当前文件是否是文件
        file_size = os.path.getsize(each_file) #返回指定文件的尺寸,单位是字节
        print(each_file)
        type_dict[each_file] = file_size #统计文件大小,将其赋值给字典中[each_file]键对应的值

#for each_type in type_dict.items():
#    print('%s【%dBytes】' % (each_type[0], each_type[1]))

#for each_type in type_dict.keys():
#    print('%s【%dBytes】' % (each_type, type_dict[each_type]))

for key,value in type_dict.items():
    print('%s【%dBytes】' % (key, value))

#1. 编写一个程序,计算当前文件夹下所有文件的大小,程序实现如图:
#思路分析:
1、把指针指定在当前目录,列出所有目录下的文件名,赋值给变量all_files;创建一个空字典。
2、for循环遍历当前目录所有文件名,判断当前文件是否是文件:
         是:统计文件大小,将其赋值给字典中[each_file]键对应的值。
3、for循环遍历file_dict.items,打印出来键和键所对应的值。

 

2. 编写一个程序,用户输入文件名以及开始搜索的路径,搜索该文件是否存在。如遇到文件夹,则进入文件夹继续搜索,程序实现如图:

Mu0m?
{$}[#tz=l Nd1*5:H^&k%v@ro
代码清单:P

import os

def search_file(dir_name, target_file):
    os.chdir(dir_name)  #改变工作目录
    all_files = os.listdir(os.curdir)

    for each_file in all_files:
        if each_file == target_file:
            print(os.getcwd() + os.sep + each_file) #getcwd返回当前工作目录 sep输出操作系统路径分隔符
        if os.path.isdir(each_file):
            search_file(each_file, target_file) #递归调用,递归调用后切记返回上一层目录
            os.chdir(os.pardir)#os.pardir代表上级目录,本命令代表跳转到上级目录

dir_name = input('please input need seek dir:')
target_file = input('please input need seek target file:')
search_file(dir_name, target_file)



#2. 编写一个程序,用户输入文件名以及开始搜索的路径,搜索该文件是否存在。如遇到文件夹,则进入文件夹继续搜索
#思路分析:
1、定义一个函数,两个形参,改变当前目录为用户Input输入目录。
2、for循环遍历当前用户输入目录下所有文件名:
     A、如果each_file和用户输入文件名相比较,名字相等,打印当前目录+分隔符+当前文件名;
     B、如果each_file循环到的是个文件夹的话,调用递归,再次搜索目标文件,返回上一级目录。
          *:这里为何要返回上一级的目的一是为了防止文件夹是个空文件夹,没有目标文件,二是为了防止例如三级和四级目录下有相同目标文件的情况。
          跳出递归的关键是,递归到each_file是文件的时候,就不会调用递归(当前目录下只有一个文件,没有文件夹)。
          这个时候肯定要返回上一级目录,进行下一次文件和文件夹的判断。

#A目录下有B、C两个子目录, B、C下无子目录:..\A\B,  ..A\C
‘比如:A目录下有子目录B 和 C。进入A目录后,发现B目录,触发递归,执行完毕后,通过os.chdir(os.pardir)返回A目录 ,然后发现C目录,触发递归,执行完毕后,通过os.chdir(os.pardir)返回A目录 。’
如果B下有子目录b,那顺序为:进入A目录后,发现B目录,触发递归(此处叫递归1),接着发现目录b,再次触发递归(此处叫递归2),递归2结束后,通过os.chdir(os.pardir)返回目录B,递归1结束后,通过os.chdir(os.pardir)返回目录A

#第一:一定要记住一点,递归就是先递进后回归,有去有回才能正确执行;
第二:每次进入子目录后,都会将其变更为工作目录,所以执行完搜索后你不退回到父级目录就不会遍历所有文件夹啊

#举个例子,假设你的开始目录为文件夹A,里面有且仅有一个文件夹B和目标文件1.txt,B内无任何文件或文件夹。此时程序从B文件夹查找,并且通过递归函数查询B文件夹内部。
由于B文件夹内没有任何文件(自然也没有目标文件),所以没有任何输出结果,此时程序自然走到'os.chdir(os.pardir) # 递归调用后切记返回上一层目录',
当前工作目录从B文件夹返回到上一级A文件夹,此时再进行查询,才能找到1.txt,程序结束

 

3. 编写一个程序,用户输入开始搜索的路径,查找该路径下(包含子文件夹内)所有的视频格式文件(要求查找mp4 rmvb, avi的格式即可),并把创建一个文件(vedioList.txt)存放所有找到的文件的路径,程序实现如图:D

v)-"'(1
*ZTYCH^FK<1SNR)E!r6u?,lah~q3L5
代码清单

import os

def search_file(start_dir, target) :
    os.chdir(start_dir) # 当前工作目录,即Python的目录(还没执行函数)
    
    for each_file in os.listdir(os.curdir) :
        ext = os.path.splitext(each_file)[1]
        if ext in target :
            vedio_list.append(os.getcwd() + os.sep + each_file + os.linesep)
            #os.linesep是标准换行符
        if os.path.isdir(each_file) :
            search_file(each_file, target) # 递归调用
            os.chdir(os.pardir) # 递归调用后切记返回上一层目录

start_dir = input('请输入待查找的初始目录:')
project_dir = os.getcwd() #当前目录是本.py的位置,应该是为了将'vediolist.txt'也保存在该路径
#print(os.getcwd())  输出结果显示为
#请输入待查找的初始目录:D:\文件\动漫
#D:\Program Files\python_xiaojiayu

target = ['.mp4', '.avi', '.rmvb']
vedio_list = []

search_file(start_dir, target) #运行函数,函数内部改变目录到start_dir,结束运行时在start_dir


#print(os.getcwd())  输出结果显示为
#请输入待查找的初始目录:D:\文件\动漫
#D:\文件\动漫
#f = open(os.getcwd() + os.sep + 'vediolist.txt', 'w', encoding='utf-8')

f = open(project_dir + os.sep + 'vediolist.txt', 'w', encoding='utf-8')
#open使用了绝对路径,所以无论当前目录在哪里,vediolist.txt都会在program_dir下。
f.writelines(vedio_list)
f.close()

4. 编写一个程序,用户输入关键字,查找当前文件夹内(如果当前文件夹内包含文件夹,则进入文件夹继续搜索)所有含有该关键字的文本文件(.txt后缀),要求显示该文件所在的位置以及关键字在文件中的具体位置(第几行第几个字符),程序实现如图:+

uR5cC=
x?u+z>OJ(Y3o*{6qGeavf<d
代码清单:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值