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 的子目录。

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