Python是跨平台的语言,同样的源代码在不同的操作系统不需要修改就可以同样实现,Python的作者倒腾了OS模块这么一个玩意儿,有了OS模块,就不需要关心什么操作系统下使用什么模块,OS模块会帮你选择正确的模块并调用
os模块中关于文件/目录常用的函数使用方法os.path模块中关于路径常用的函数使用方法
0.统计当前目录下每个文件类型的文件数
思路:在当前目录下遍历所有文件(文件夹归为一类),os.path.splitext(file)来获取文件的扩展名,字典set.default()函数来记录文件类型与其对应的数量
importos
all_files= os.listdir('.')#os.listdir(os.curdir)同于os.listdir(‘.’)
type_dict = dict() #定义一个空字典来存放(“后缀”:数量)
for each_file inall_files:ifos.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 intype_dict.keys():print('该文件夹下共有类型为【%s】的文件 %d 个' % (each_type, type_dict[each_type]))
1.计算当前文件夹下所有文件的大小
思路:获取当前目录下的文件和文件夹,遍历时判断如果是文件类型就获取名字&大小(getsize(file))并用字典setdefault()函数来记录
importos
all_files= os.listdir('.')
size_dict=dict()for each_file inall_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.用户输入文件名以及开始搜索的路径,搜索该文件是否存在。如遇到文件夹,则进入文件夹继续搜索。
思路:指定路径,跳转,遍历目录下的文件,如果名字匹配(即存在)就输出路径+文件名,如果是文件夹就调用函数本身又开始跳转至该文件夹内遍历匹配,然后返回上一级接着后续文件夹查找
importosdefsearch(fname,fdir):
os.chdir(fdir)#改变工作目录到指定的路径下
for each_file in os.listdir('.'):if each_file ==fname:print(os.getcwd() + os.sep +fname)ifos.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文本文件里,遇到文件夹调用自身函数
importos
music_list=[]defm_search(fdir):
os.chdir(fdir)#改变工作目录到指定的路径下
for each_file in os.listdir('.'): #listdir列举指定目录中的文件名
ifos.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)
ifos.path.isdir(each_file):
m_search(each_file)
os.chdir('..') #os.pardir同于'..'上一级目录 os.linesep
returnmusic_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()要指定范围。眼睛说我当时看懂了,手基本也听话,但脑子困了.......
importosdefindex_print(key_dict):
keys=key_dict.keys()
keys= sorted(keys) #由于字典是无序的,所以要对行数进行排序
for each_key inkeys: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))
returnindex#检测 str 是否包含在 string 中,如果 beg 和 end 指定范围,则检查是否包含在指定范围内,如果是返回开始的索引值,否则返回-1
def row_search(filename,keyword): #找到有关键字的文件,并记录第几行
file =open(filename)
row= 0 #记录行数
key_dict = dict() #存放关键字keyword所在行数及对应的位置
for eachline infile:
row+= 1
if keyword ineachline:
index= index_search(eachline,keyword) #关键字在每行对应的位置,eachline是字符串
key_dict[row] =index
file.close()returnkey_dictdeffile_search(key_word,feedback):
txt_list = [] #用来存放.txt格式的路径+文件名
for file_info inos.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) #找到有关键字的文件
ifkey_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\[, οnerrοr=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 的子目录。
返回值:该方法没有返回值!!