专栏首页石开之旅小甲鱼《零基础学习Python》课后笔记(三十):文件系统——介绍一个高大上的东西

小甲鱼《零基础学习Python》课后笔记(三十):文件系统——介绍一个高大上的东西

动动手 0.编写一个程序,统计当前目录下每个文件类型的文件数,程序实现如图:

代码如下:

import os 
filename_list = os.listdir(os.curdir)
filetype_dict = dict()

for each_file in filename_list:
	if os.path.isdir(each_file):
		filetype_dict.setdefault('文件夹', 0)	# 如果键不存在于字典中,将会添加键并将值设为默认值
		filetype_dict['文件夹'] += 1
	else:
		file_type = os.path.splitext(each_file)[1]	#返回的是元组,第一个是文件名,第二个是扩展名
		filetype_dict.setdefault(file_type, 0)
		filetype_dict[file_type] += 1

for each_type in filetype_dict.keys():	
	print('该文件夹下共有类型为【%s】的文件%d个' % (each_type, filetype_dict[each_type]))

测试结果:

================== RESTART: I:\Python\小甲鱼\test003\test0.py ==================  
该文件夹下共有类型为【.mp3】的文件2个  
该文件夹下共有类型为【.txt】的文件2个  
该文件夹下共有类型为【.py】的文件1个  

1.编写一个程序,计算当前文件夹下所有文件的大小,程序实现如图:

代码如下:

import os
filename_list = os.listdir(os.curdir)
file_dict = dict()

for each_file in filename_list:
	file_size = os.path.getsize(each_file)
	file_dict.setdefault(each_file, file_size)

for each_file in file_dict.keys():
	print('%s【%d】Bytes' % (each_file, file_dict[each_file]))

测试结果:

================== RESTART: I:\Python\小甲鱼\test003\test0.py ==================  
Readme.mp3【5733532】Bytes  
something.txt【106】Bytes  
test0.py【292】Bytes  
听写1.mp3【992235】Bytes  
我.txt【122】Bytes  

2.编写一个程序,用户输入文件名以及开始搜索的路径,搜索该文件是否存在。如遇到文件夹,则进入文件夹继续搜索,程序实现如图:

代码如下:

import os

def search_file(search_dir, search_target):
	"查找目录下的文件并输出路径"
	os.chdir(search_dir)
	for each_file in os.listdir(os.curdir):
		if each_file == search_target:
			print(os.getcwd() + os.sep + each_file)
		if os.path.isdir(each_file):
			search_file(each_file, search_target)
			os.chdir(os.pardir)

search_dir = input('请输入待查找的初始目录:')
search_target = input('请输入需要查找的目标文件:')
search_file(search_dir, search_target)

测试结果:

1.	================== RESTART: I:\Python\小甲鱼\test003\test0.py ==================  
2.	请输入待查找的初始目录:K:\\图像  
3.	请输入需要查找的目标文件:9.png  
4.	K:\图像\9.png  
5.	K:\图像\新建文件夹\9.png  
6.	K:\图像\新建文件夹\新建文件夹\9.png 

3.编写一个程序,用户输入开始搜索的路径,查找该路径下(包含子文件夹)所有的视频格式文件(要求查找mp4,rmvb,avi的格式即可),并创建一个文件(vedioList.txt)存放找到的文件的路径,程序实现如图:

代码如下:

import os

def search_vedio(search_dir):
	"查找目录下的所有视频格式文件,并创建一个文件保存文件的路径"
	os.chdir(search_dir)
	for each_file in os.listdir(os.curdir):
		if os.path.splitext(each_file)[1] in file_type_list:
			file_name = os.getcwd() + os.sep + each_file + os.linesep
			file_list.append(file_name)
		if os.path.isdir(each_file):
			search_vedio(each_file)
			os.chdir(os.pardir)
			
file_type_list = ['.mp4', '.rmvb', '.avi', '.wmv']
file = open(os.getcwd() +os.sep + 'vedioList.txt', 'w')
file_list = []

search_dir = input('请输入待查找的初始目录:')
search_vedio(search_dir)
file.writelines(file_list)
file.close()

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

代码如下:

import os


def print_pos(target_words_dict):
	keys = target_words_dict.keys()
	keys = sorted(keys)
	for each_key in keys:
		print('关键字出现在第%s行,第%s个位置。' % (each_key, str(target_words_dict[each_key])))


def pos_in_line(line, target_words):
	pos = []
	count = line.find(target_words)
	while count != -1:
		pos.append(count + 1)	#字符索引从0开始
		count = line.find(target_words, count + 1)	#从下一个位置开始查找


	return pos


def search_in_file(file_name, target_words):
	file = open(file_name)
	line_count = 0
	target_words_dict = dict()
	for each_line in file:
		line_count += 1
		if target_words in each_line:
			pos = pos_in_line(each_line, target_words)
			target_words_dict[line_count] = pos

	file.close()
	return target_words_dict


def search_words(target_words, option):
	files = os.walk(os.getcwd())
	target_files = []

	for each in files:
		for each_file in each[2]:
			if os.path.splitext(each_file)[1] == '.txt':
				each_file = os.path.join(each[0], each_file)
				target_files.append(each_file)

	for each in target_files:
		target_words_dict = search_in_file(each, target_words)
		if target_words_dict:
			print('==============================================')
			print('在文件【%s】中找到关键字【%s】' % (each, target_words))
			if option.upper() == 'YES':
				print_pos(target_words_dict)
	
target_words = input('请将该脚本放于待查找的文件夹内,请输入关键字:')
option = input('请问是否需要打印关键字【%s】在文件中的具体位置(YES/NO):')
search_words(target_words, option)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 小甲鱼《零基础学习Python》课后笔记(三十五):图形用户界面入门——EasyGui

    1.实现一个用于登记用户账号信息的界面(如果是带*号的必填项,要求一定要有输入并且不能是空格)。

    小火柴棒
  • 小甲鱼《零基础学习Python》课后笔记(三十四):丰富的else语句及简洁的with语句

    测试题 0.在Python中,else语句能跟哪些语句进行搭配? a)if…else语句,“要么怎样。要么不怎样” b)while或for…else语句,...

    小火柴棒
  • 硬件笔记(8)----USB学习笔记5

    如前面所述,当某个设备被连接到 USB 主机上,该设备会向主机提供其功能和电源要求。通常,设备会通过一个描述符表格(其固件的一部分)来提供这些信息。描述符表格是...

    小火柴棒
  • 【Pre-Training】GPT-2:四只角的独角兽

    今天阅读的是 OpenAI 的同学于 2019 年发表的论文《Language Models are Unsupervised Multitask Learne...

    阿泽 Crz
  • 三分钟了解Web应用程序防火墙是如何保护网站的?

    Web应用程序防火墙(有时也简称为WAF )可以通过监视和过滤Internet与网站之间的HTTP通信来保护网站。

    用户7261497
  • Scalaz(38)- Free :Coproduct-Monadic语句组合

       很多函数式编程爱好者都把FP称为Monadic Programming,意思是用Monad进行编程。我想FP作为一种比较成熟的编程模式,应该有一套比较规范...

    用户1150956
  • C#笔记:LinqToObject用法

    Linq作为 .net3.5 可以比肩蓝翔挖掘机的重磅产品,当然可以对万事万物进行查询。而不只是查查xml,数据库可以概括的。自然,我们也能用它对List<T>...

    超级大猪
  • ZkClient使用

    使用原生的Zookeeper API来与Zookeeper服务端进行交互还是比较繁琐复杂的,为了简化这些操作,就诞生了一些封装客户端。这些客户端除了简单易用,还...

    shysh95
  • Lint Tool Analysis (2)

    本系列的几篇源码分析文档意义不大,如果你正好也在研究lint源码,或者你想知道前面自定义lint规则中提出的那几个问题,抑或你只是想大致了解下lint的源码都有...

    宅男潇涧
  • python中的热更新或动态加载

    遍览网络中关于动态加载模块的文章,发现有两种方法,一种是用守护进程的方法,一种是用python自带的reload函数。

    py3study

扫码关注云+社区

领取腾讯云代金券