Python_OS模块实战以及UnicodeDecodeError: ‘gbk‘ 解决方法(统计文件数目,计算文件夹大小,递归搜索文件,储存文件路径,文件深度遍历os.walk)

1.统计当前目录下每个文件类型的文件数

import os #导入os模块

all_file=os.listdir(os.curdir)#当前路径下所有文件

type_dict=dict()#创建字典

for each_file in all_file:
    if os.path.isdir(each_file):#判断是否是文件夹,是返回True
        type_dict.setdefault("文件夹",0)#插入字典
        type_dict["文件夹"]+=1
    else:
        type_name=os.path.splitext(each_file)[1]#返回文件名以及后缀,选择后缀
        type_dict.setdefault(type_name,0)
        type_dict[type_name]+=1

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

在这里插入图片描述

2.计算当前文件夹下所有文件的大小

import os

all_file=os.listdir(os.curdir)

file_dict=dict()

for each_file in all_file:
    if os.path.isfile(each_file):
        file_size=os.path.getsize(each_file)
        file_dict[each_file]=file_size

for each in file_dict.items():#each是字典里的每个元素
    print("%s[%d Bytes]"%(each[0],each[1]))#each[0]=key each[1]=value

在这里插入图片描述

3. 用户输入文件名以及开始搜索的路径,搜索该文件是否存在。如遇到文件夹,则进入文件夹继续搜索

import os

def FindFile(Findir,target):#函数传入搜索路径,要查找的文件名
    os.chdir(Findir)
    #修改当前工作路径 如果修改的工作目录不存在,Python 解释器会报错

    for each_file in os.listdir(os.curdir):#当前目录下所有文件
        if each_file ==target:
            #打印文件路径
            print(os.getcwd()+os.sep+each_file)
            #os.sep根据你所处的平台,自动采用相应的分隔符号。
        elif os.path.isdir(each_file):
            #进入文件夹递归调用
            FindFile(each_file,target)
            #递归结束后返回原来的目录
            os.chdir(os.pardir)


Findir=input("请输入查找目录:")
target=input("请输入要查找的目标文件:")
FindFile(Findir,target)

在这里插入图片描述

4.用户输入开始搜索的路径,查找该路径下(包含子文件夹内)所有的Python文件以及普通文档(后缀是.py/.txt),并把创建一个文件(py.txt)存放所有找到的文件的路径

import os

FileList=[]#全局列表储存要写入到文件的内容

def FindFile(StartDir,target):#传入目标路径以及要查找的列表
    os.chdir(StartDir)

    for eachFile in os.listdir(os.curdir):
        Type=os.path.splitext(eachFile)[1]#文件后缀

        if Type in target:
            FileList.append(os.getcwd()+os.sep+eachFile+os.linesep)
            #os.linesep字符串给出当前平台使用的行终止符。例如,Windows使用’\r\n’
        elif os.path.isdir(eachFile):
            FindFile(eachFile,target)
            #递归结束返回原来路径
            os.chdir(os.pardir)

StartDir=input("输入要查找的起始路径:")

SaveDir=os.getcwd()#获取要保存的文件路径

target=[".py",".txt"]

FindFile(StartDir,target)

File=open(SaveDir+os.sep+"py.txt",'w')#带路径以写方式创建文件,没有文件时创建
File.writelines(FileList)#将列表所有元素写入文件中
File.close()

在这里插入图片描述

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

UnicodeDecodeError: ‘gbk’ codec can’t decode byte错误解决

解决方法连接

#os.walk 的返回值是一个三元组(root,dirs,files)
#root 指的是当前正在遍历的这个文件夹的本身的地址
#dirs 返回的是一个列表list,表中数据是该文件夹中所有的目录的名称(但不包括子目录名称)
#files 返回的也是一个列表list , 表中数据是该文件夹中所有的文件名称(但不包括子目录名称)

import os

def PrintPos(Key_Pos):
    keys=Key_Pos.keys()
    keys=sorted(keys)#字典键值无序,这里先对键值数组排序
    for each_key in keys:
        print("关键字出现在第%s行,第%s个位置"%(each_key,str(Key_Pos[each_key])))

def PosInLine(line,Key):
    Pos=[]
    begin=line.find(Key)
    while begin!=-1:
        Pos.append(begin+1)#因为起始为0开始计数,用户默认起始从1开始
        begin=line.find(Key,begin+1)#找下一个位置
    return Pos

def SearchTxT(FileName,Key):#在文件中查找是否有关键字
    File=open(FileName,'r',encoding='gbk',errors='ignore')#已带路径
    #避免出现UnicodeDecodeError: 'gbk' codec can't decode byte 0xaa in position 9等错误
    row=0#行数
    Key_Pos=dict()#存放key所在具体行数的映射
    for each_line in File:
        row+=1
        if Key in each_line:
            Pos=PosInLine(each_line,Key)#在这一行的第几个字节
            Key_Pos[row]=Pos
    File.close()
    return Key_Pos

def FindFile(Key,flag):#传入两个参数,一个是要查找的关键字,另一个是是否显示具体位置选项
    Files=os.walk(os.getcwd())
    TxT=[]
    for i in Files:
        for File in i[2]:
            if os.path.splitext(File)[1] ==".txt":
                File=os.path.join(i[0],File)#连接两个或更多的路径名组件
                TxT.append(File)
    for eachTxT in TxT:
        Key_Pos=SearchTxT(eachTxT,Key)
        if Key_Pos:
            print("======================================================")
            print("在文件[%s]中找到关键字(%s)"%(eachTxT,Key))
        if flag in ["YES","Yes","yes"]:#需要打印具体位置
            PrintPos(Key_Pos)

#主函数
print("请将该脚本放入要查找关键字的文件夹中")
Key=input("请输入要查找的关键字:")
flag=input("是否需要打印关键字[%s]在文件的具体位置(Yes/No):"%Key)
FindFile(Key,flag)

Stop=input()#卡一下程序,防止闪退,方便测试

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NUC_Dodamce

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值