第30讲:文件系统:介绍一个高大上的东西

动动手:

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



答案:
import os
print('当前文件夹为:%s' % os.getcwd())
all_files = os.listdir(os.curdir)       #listdir()-列举指定目录中的文件名,使用os.curdir指代当前目录
type_dict = dict()          #创建一个字典

for each_file in all_files:
    if os.path.isdir(each_file):            #isdir判断指定路径是否存在且是一个目录
        type_dict.setdefault('文件夹', 0)          #?这里不明白为什么每次循环不会初始化字典的值,而且还会做累加。
        type_dict['文件夹'] += 1
    else:
        ext = os.path.splitext(each_file)[1]    #这里的分割是带点的,如:.txt
        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.编写一个程序,计算当前文件夹下所有文件的大小,程序实现如图:



答案:

import os

all_files = os.listdir(os.curdir)
file_dict = dict()

for each_file in all_files:
    if os.path.isfile(each_file):
        file_size = os.path.getsize(each_file)
        file_dict[each_file] = file_size       #相当于file_dict = {each_line:file_size} 

for each in file_dict.items():
    print('%s【%dBytes】' % (each[0], each[1]))

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



答案:
import os

def search_file(start_dir, target):
    os.chdir(start_dir)             #改变工作目录

    for each_file in os.listdir(os.curdir):
        if each_file == target:
            print(os.getcwd() + os.sep + each_file)
             #getcwd()返回当前目录||os.sep输出操作系统特定的路径分隔符(win下为'\\',linux下为'/')
        if os.path.isdir(each_file):
            search_file(each_file, target)      #递归调用
            os.chdir(os.pardir)                     #指代上一级目录('..')

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


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



答案:
import os

def search_file(start_dir, target):
    os.chdir(start_dir)

    for each_file in os.listdir(os.curdir):
        ext = os.path.splitext(each_file)[1]
        if ext in target:
            vedio_list.append(os.getcwd() + os.sep + each_file + os.linesep)
        if os.path.isdir(each_file):
            search_file(each_file, target)      #递归调用
            os.chdir(os.pardir)                     #递归调用后切记返回上一层目录

start_dir = input('请输入待查找的初始目录:')
program_dir = os.getcwd()

target = ['.mp4', '.avi', '.rmvb']
vedio_list = []

search_file(start_dir, target)

f = open(program_dir + os.sep + 'vedioList.txt', 'w')       #在当前目录打开'vedioList.txt'
f.writelines(vedio_list)
f.close()


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



答案:
待填坑……



Notes:

1.这讲主要讲了:http://bbs.fishc.com/forum.php?mod=viewthread&tid=45512&extra=page%3D1%26filter%3Dtypeid%26typeid%3D403  这个链接里的内容。

2.os模块
>>> os.chdir('E:\\') #要切换目录时,要带双引号,\\等于/
>>> os.getcwd()
'E:\\'
>>> os.mkdir('E:\\A\\B') #要有A之后才能创建B
>>> os.removedirs("E:/A/B/C") 递归删除目录,从子目录到父目录逐层尝试删除,遇到目录非空则停止删除,不抛出错误。
>>> os.removedirs("E:/A/B") #要先给出最内层的目录
>>> os.system('calc') #打开计算器

other:

>>> os.listdir(os.curdir)
>>> os.listdir(os.pardir)


3.os.path模块



注意basename(path)、dirname(path)、join()、split()、splitext()方法是对路径进行操作(其实就是对你输入的路径字符串进行操作),不是去访问该路径下的文件;getsize()、getatime()、getctime()、getmtime()才是对路径文件进行操作。

引用时需要有os.path,比如:os.path.basename('E:/a/b/123.txt')

>>> os.path.join('C:/', 'b', 'c', 'd')    #join-将path1,path2各部分组合成一个路径名
'C:/b\\c\\d'

>>> os.path.split("E:/A/B/C")    #split类似于字符串的split,分割文件名和路径,返回一个元组。就如例子中的'C',假设是一个目录,但是返回时还是当作一个文件进行分割。
('E:/A/B', 'C')

os.path.getatime(file)-返回指定文件最近的访问时间(浮点型秒数,可用time模块的gmtime()或localtime()函数进行换算,gmtime()是国际标准时)
>>> os.path.getatime('E:/something.txt')
1503312884.3365867    #浮点型秒数
>>> import time
>>> time.localtime(os.path.getatime("E:/something.txt"))    #这里是本地时间
time.struct_time(tm_year=2017, tm_mon=8, tm_mday=21, tm_hour=18, tm_min=54, tm_sec=44, tm_wday=0, tm_yday=233, tm_isdst=0)

https://zhidao.baidu.com/question/54621865.html    #相对路径和绝对路径的区别

islink(path)-判断指定路径是否存在且是一个符号链接,符号链接就是快捷方式

>>> os.path.ismount('E:/')    #判定指定路径是否是挂载点,挂载点就是指'A:/'或'C:/'或'D:/'
True


























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值