1. 程式人生 > >[Python]小甲魚Python視頻第030課(文件系統:介紹一個高大上的東西)課後題及參考解答

[Python]小甲魚Python視頻第030課(文件系統:介紹一個高大上的東西)課後題及參考解答

sep 方式 str 視頻格式 min ets 要求 遍歷文件夾 所有

# -*- coding: utf-8 -*-
"""
Created on Fri Mar  8 15:49:32 2019

@author: Administrator
"""

                                                  
"""

動動手:
0. 編寫一個程序,統計當前目錄下每個文件類型的文件數,程序實現如圖:
1. 編寫一個程序,計算當前文件夾下所有文件的大小,程序實現如圖
2. 編寫一個程序,用戶輸入文件名以及開始搜索的路徑,搜索該文件是否存在。如遇到文件夾,則進入文件夾繼續搜索,程序實現如圖
3. 編寫一個程序,用戶輸入開始搜索的路徑,查找該路徑下(包含子文件夾內)所有的視頻格式文件(要求查找mp4 rmvb, avi的格式即可),並把創建一個文件(vedioList.txt)存放所有找到的文件的路徑,程序實現如圖:
4. 編寫一個程序,用戶輸入關鍵字,查找當前文件夾內(如果當前文件夾內包含文件夾,則進入文件夾繼續搜索)所有含有該關鍵字的文本文件(.txt後綴),要求顯示該文件所在的位置以及關鍵字在文件中的具體位置(第幾行第幾個字符),程序實現如圖:

"""

import os

#動動手0
def count_file_format_num():
    file_folder = "F:\\drink_c_02010121\\test9";
    result_dict = dict();
    
    result_dict[‘無後綴名文件‘] = 0
    result_dict[‘文件夾‘] = 0
    
    filelist = os.listdir(file_folder);
    for each in filelist:
        each_full_name = file_folder+‘\\‘+each
        if os.path.isfile(each_full_name):
            if ‘.‘ in each:
                file_name = each.split(‘.‘);
                if file_name[-1] in result_dict.keys():
                    result_dict[file_name[-1]] += 1;
                else:
                    result_dict[file_name[-1]] = 1;
            else:
                result_dict[‘無後綴名文件‘] +=1;
        else:
            result_dict[‘文件夾‘] +=1;
                
            
        
    print(‘ [%s] 中共有[%d]類文件‘ % (file_folder,len(result_dict.keys())))
    for key in result_dict.keys():
        print("該文件夾下共有類型為【%s】的文件【%d】個" % (‘.‘+key,result_dict[key]))
        
        
        
        
#動動手1
def get_file_size():
    file_folder = "F:\\drink_c_02010121\\test9\\";
    result_dict = dict();           
    filelist = os.listdir(file_folder);

    for each in filelist:
        each_file_full_name = file_folder + os.sep + each;
        result_dict[each] = os.path.getsize(each_file_full_name)
    
    for key in result_dict.keys():
        print(‘%s 【%dBytes】‘ % (key,result_dict[key]));


#動動手2:
def find_file_in_dir(folder_path,target_file_name):
    filelist = os.listdir(folder_path)
    for each in filelist:
        #each_full_name = folder_path +‘\\‘+ each
        each_full_name = folder_path + os.sep + each;
        if each == target_file_name and os.path.isfile(each_full_name):
            print(each_full_name)
        if os.path.isdir(each_full_name):
            find_file_in_dir(each_full_name,target_file_name)
    
#folder_path = input(‘請輸入待查找的初始目錄:‘)
#target_file_name = input(‘請輸入需要查找的目標文件:‘)
#find_file_in_dir(folder_path,target_file_name)    


#動動手3
#非遞歸方式,只能到本層和下一層
def get_spec_file_num():
    file_folder = "F:\\drink_c_02010121\\test9"
    result_list = list();
    filelist = os.listdir(file_folder)
    
    valid_suffix = [‘rar‘,‘h‘];
    
    
    for each in filelist:
        if os.path.isdir(file_folder+‘\\‘+each):
            sub_file_folder = file_folder +‘\\‘ + each;
            sub_file_list = os.listdir(sub_file_folder)
            for sub_each in sub_file_list:
                filename = sub_each.split(‘.‘);
                if len(filename) >=2 and filename[-1] in valid_suffix:
                    result_list.append(sub_file_folder+‘\\‘+sub_each);
        else:
            filename = each.split(‘.‘);
            if len(filename) >= 2 and filename[-1] in valid_suffix:
                result_list.append(file_folder+‘\\‘+each);
            
    f_out = open(‘file_list.txt‘,‘w‘);
    
    for each in result_list:
        f_out.writelines(each+‘\n‘);
    f_out.close();
    
    
#遞歸方式,遞歸遍歷子文件夾
result_list = list()
valid_suffix = [‘rar‘,‘h‘];
def get_spec_file_num_res( folder_path ):
    global result_list
    global valid_suffix
    
    filelist = os.listdir(folder_path)
    for each in filelist:
        if os.path.isdir(folder_path+‘\\‘+each):
            get_spec_file_num_res(folder_path+‘\\‘+each);
        else:
            filename = each.split(‘.‘);
            if len(filename) >= 2 and filename[-1] in valid_suffix:
                result_list.append(folder_path+‘\\‘+each);
        
            
    
#動動手4:
#0.遍歷文件夾獲得以.txt結尾的文件
#1.獲取.txt文件的內容,獲取關鍵字的存在與否的信息並打印出來

def get_key_word_info_of_txt_file( folder_path,key_word):

    file_list = os.listdir(folder_path);   
    for each in file_list:
        each_full_name = folder_path + ‘\\‘ + each 
        if os.path.isdir(each_full_name):
            get_key_word_info_of_txt_file(each_full_name,key_word)
        elif each.endswith(‘.txt‘) and os.path.isfile(each_full_name):
            file_obj = open(each_full_name,‘r‘)
            file_valid = 0;
            lines_count = 0;
            for each_line in file_obj:
                lines_count += 1;
                locs = [];
                #lines = [];
                str_count = each_line.count(key_word);
                index = 0;
                while str_count!=0:
                    index = each_line.find(key_word,index)
                    locs.append(index);
                    index = index + 1;
                    str_count -= 1;
                if len(locs)!=0:  
                    file_valid = 1 if file_valid == 0 else 2;
                    if file_valid == 1:
                        print(‘文件【%s】中出現關鍵字【%s】:‘ % (each_full_name,key_word))
                    print(‘關鍵字【%s】出現在 %d 行,第%s 個位置‘ %(key_word,lines_count,locs));
            file_obj.close()



get_key_word_info_of_txt_file( ‘C:\\Users\\fengs\Desktop\\SVN_TEST\\Python\\小甲魚課後題\\測試文件夾‘,‘1‘)    
    
#count_file_format_num()
#get_file_size()
    
#get_spec_file_num_res(‘F:\\drink_c_02010121\\test9‘)
#for each in result_list:
#    print(each)

"""
需要註意的問題:
1. 目錄分隔符可以用python提供的 os.sep 來代替,以適應不同的操作系統
2. 我的代碼都是用的絕對路徑,所以不存在切換目錄的問題
3. 若要用相對路徑,相關的常量:
    os.curdir   -----> 當前目錄
    os.sep      -----> 目錄分隔符
    os.chdir()  -----> 切換工作目錄
    os.pardir   -----> 當前工作目錄的上一層目錄
    os.getcwd() -----> 當前工作目錄的絕對路徑

"""

  

[Python]小甲魚Python視頻第030課(文件系統:介紹一個高大上的東西)課後題及參考解答