zoukankan      html  css  js  c++  java
  • 再战文件(小甲鱼课后题)python超级入门

    Python是跨平台的语言,同样的源代码在不同的操作系统不需要修改就可以同样实现,Python的作者倒腾了OS模块这么一个玩意儿,有了OS模块,就不需要关心什么操作系统下使用什么模块,OS模块会帮你选择正确的模块并调用

    os模块中关于文件/目录常用的函数使用方法os.path模块中关于路径常用的函数使用方法     

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

    思路:在当前目录下遍历所有文件(文件夹归为一类),os.path.splitext(file)来获取文件的扩展名,字典set.default()函数来记录文件类型与其对应的数量

    import os
    
    all_files = os.listdir('.')                  #os.listdir(os.curdir)同于os.listdir(‘.’)
    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]           #splitext(path)分离文件名与扩展名
                                                           # 返回的是元组(name,extension),这里[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.计算当前文件夹下所有文件的大小

    思路:获取当前目录下的文件和文件夹,遍历时判断如果是文件类型就获取名字&大小(getsize(file))并用字典setdefault()函数来记录

    import os
    
    all_files = os.listdir('.')
    size_dict = dict()
    for each_file in all_files:
        if os.path.isfile(each_file):    #判断是否是文件
            size_dict.setdefault(each_file,os.path.getsize(each_file))
            print('%s【%sBytes】' % (each_file, size_dict[each_file]))

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

    思路:指定路径,跳转,遍历目录下的文件,如果名字匹配(即存在)就输出路径+文件名,如果是文件夹就调用函数本身又开始跳转至该文件夹内遍历匹配,然后返回上一级接着后续文件夹查找

    import os
    
    def search(fname,fdir):
        os.chdir(fdir)                                 #改变工作目录到指定的路径下
        for each_file in os.listdir('.'):
            if each_file == fname:
                print(os.getcwd() + os.sep + fname)
            if os.path.isdir(each_file):
                search(fname,each_file)
                os.chdir('..')                         #os.pardir同于'..'上一级目录
        
    
    fname = input('请输入要查找的文件名:')
    fdir = input('请输入开始搜索的路径:')
    search(fname,fdir)

    3.用户输入开始搜索的路径,查找该路径下(包含子文件夹内)所有的音频格式文件(mp3||wav||cda格式即可),并把创建一个文件(musicList.txt)存放所有找到的文件的路径

    思路:综合了1、2题,新建txt文件,遍历目录下的文件,如果是文件,splitext()获取扩展名,再判断若是音频格式就写入musicList文本文件里,遇到文件夹调用自身函数

    import os
    
    music_list = []
    
    def m_search(fdir):
        
        os.chdir(fdir)                                                                #改变工作目录到指定的路径下
        for each_file in os.listdir('.'):                                             #listdir列举指定目录中的文件名 
            if os.path.isfile(each_file):
                ext = os.path.splitext(each_file)[1]
                if ext.upper() in '.MP3.WAV.CDA':
                    music_list.append(os.getcwd() + os.sep + each_file+ os.linesep)
            if os.path.isdir(each_file):
                m_search(each_file)
                os.chdir('..')                                                        #os.pardir同于'..'上一级目录 os.linesep
        return music_list
        
    
    fdir = input('请输入开始搜索的路径:')
    music_list = m_search(fdir)
    musicList = open(os.getcwd() + os.sep + 'musiclist.txt','w')
    musicList.writelines(music_list)
    musicList.close()

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

    思路:输入关键字,1遍历当前文件夹的内容并记录(当前的路径+文件夹名+文件名),把文件单独记录到一个专门存放路径+文件名的列表里;2遍历列表里的从文件,找到有关键字的文件并记录在第几行,以及行数对应的位置保存在字典里;3找关键字在行里对应的位置(这点一开始我是不懂咋写滴),准备一个列表存放关键字的第一个位置,遍历每一行用str.find()来判断关键字是否在行里,如果是就返回开始的索引值否则返回-1(当返回值不是-1我们就插入列表里存放),然后从开始索引值的下一位继续开始,所以第二次使用find()要指定范围。眼睛说我当时看懂了,手基本也听话,但脑子困了.......

    import os
    
    def index_print(key_dict):
        keys = key_dict.keys()
        keys = sorted(keys)                                   # 由于字典是无序的,所以要对行数进行排序
        for each_key in keys:
            print('关键字出现在第%s行,第%s个位置。' % (each_key, str(key_dict[each_key])))
    
    def index_search(line,keyword):                           #line是字符串
        index = []
        begin = line.find(keyword)
        while begin != -1:                                    #当关键字在行里
            index.append(begin + 1)                           #用户的角度是从1开始数
            begin = line.find(keyword,begin + 1)              #string.find(str, beg=0, end=len(string))
        return index
    #检测 str 是否包含在 string 中,如果 beg 和 end 指定范围,则检查是否包含在指定范围内,如果是返回开始的索引值,否则返回-1
    
    def row_search(filename,keyword):                         #找到有关键字的文件,并记录第几行
        file = open(filename)
        row = 0                                               #记录行数
        key_dict = dict()                                     #存放关键字keyword所在行数及对应的位置
    
        for eachline in file:
            row += 1
            if keyword in eachline:
                index = index_search(eachline,keyword)        #关键字在每行对应的位置,eachline是字符串
                key_dict[row] = index
    
        file.close()
        return key_dict
    
    def file_search(key_word,feedback):   
        txt_list = []                                         #用来存放.txt格式的路径+文件名
    
        for file_info in os.walk(os.getcwd()):                #遍历文件信息,把文件信息用walk()保存在(当前路径,包含的文件夹,包含的文件)
            for each_file in file_info[2]:         
                if os.path.splitext(each_file)[1] == '.txt':  #如果是文档就记录路径+文件名,存放到txt_list列表中
                    txt_list.append(os.path.join(file_info[0],each_file))
            
        for each_txt in txt_list:                             #遍历列表
            key_dict = row_search(each_txt,key_word)          #找到有关键字的文件
            if key_dict:
                print('===============================================================')
                print('在文件【%s】中找到关键字【%s】' % (each_txt,key_word))
                if feedback.upper() in ['YES','Y','NO','N']:
                    index_print(key_dict)
    
    key_word = input('请输入关键字:')
    feedback = input('是否需要打印关键字【%s】在文件中的具体位置(YES/NO):' % key_word)
    file_search(key_word,feedback)

    其次,是os.walk( ) 方法

    os.walk() 方法用于通过在目录树中游走输出在目录中的文件名,向上或者向下。

    os.walk() 方法是一个简单易用的文件、目录遍历器,可以高效的处理文件、目录方面的事情。

    os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])

    • top -- 是你所要遍历的目录的地址, 返回的是一个三元组(root,dirs,files)。
    • root 所指的是当前正在遍历的这个文件夹的本身的地址
    • dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录)
    • files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)
    • topdown --可选,为 True,则优先遍历 top 目录,否则优先遍历 top 的子目录(默认为开启)。
    • onerror -- 可选,需要一个 callable 对象,当 walk 需要异常时,会调用。
    • followlinks -- 可选,如果为 True,则会遍历目录下的快捷方式(linux 下是软连接 symbolic link )实际所指的目录(默认关闭),如果为 False,则优先遍历 top 的子目录。

    返回值:该方法没有返回值!!



  • 相关阅读:
    祝大家光棍节快乐!
    [Spring] Oracle TopLink O/R Mapping integrates Spring.
    VS2005 vs Eclipse, functions i expected.
    [English] Adverb for link (Chinese)
    有几个Gmail的Invitation
    Experience online service of MS small business (bCentral)
    多态(Polymorphism)
    Check your site and build meta tags for search engines
    关于怎样用javascript判断网页上我们想要必须选择的复选框至少选择一个的问题
    关于在VS2010中学习c++的MFC
  • 原文地址:https://www.cnblogs.com/mumulucky/p/13562787.html
Copyright © 2011-2022 走看看