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 的子目录。
返回值:该方法没有返回值!!