2020年9月16日星期三

[課後作業] 第030講:文件系統:介紹一個高大上的東西|課後測試題及答案

[課後作業] 第030講:文件系統:介紹一個高大上的東西|課後測試題及答案



《零基礎入門學習Python》視頻下載地址:傳送門d;Z>-
J#Tp;*nS8,1CZ~W_FN(LVH<'
動動手:來自:bbs.fishc.com
3$Gy12ExNJ0~M9W.}; bXL
0.編寫一個程序,統計當前目錄下每個文件類型的文件數,程序實現如圖:0H+,Ag]Ql
e)%?3mh9}a #xBASX<V"57jt;

TBzu,Ir"-)J2(WQ37dm@jxY&C!FA%
o<-hr2[ bd?5*gk^OmH%iZF3&
1.編寫一個程序,計算當前文件夾下所有文件的大小,程序實現如圖:58 ?t|04
|`!Z6#Q.14,tD7Okh{jcIig

`:xw3+Yv={jX18,WQU'ZD]<RK)s*
[akcG=2T7gAK]o'0(:@jmNHsU
2.編寫一個程序,用戶輸入文件名以及開始搜索的路徑,搜索該文件是否存在。如遇到文件夾,則進入文件夾繼續搜索,程序實現如圖:#}3v7SDj)z
m#f82J`n9t6$5h_bVze!LZ(

K%~!orl"?-LqI&nGHR`MZ9)=<;
NL}@E+kc,p.g'6ovP7{1[
3.編寫一個程序,用戶輸入開始搜索的路徑,查找該路徑下(包含子文件夾內)所有的視頻格式文件(要求查找mp4 rmvb, avi的格式即可),並把創建一個文件(vedioList.txt)存放所有找到的文件的路徑,程序實現如圖:](*?. ,'S
]<6V~&%4e+y=B.EA,b5`H#u:Zc2?

$FI'Smz%#~k6B2hr-iptux
+bcX4VU1(ny#).%jAQwR
4.編寫一個程序,用戶輸入關鍵字,查找當前文件夾內(如果當前文件夾內包含文件夾,則進入文件夾繼續搜索)所有含有該關鍵字的文本文件(.txt後綴),要求顯示該文件所在的位置以及關鍵字在文件中的具體位置(第幾行第幾個字符),程序實現如圖:v7czX
b. CAsdU~o^=21'* ![W>y`hi;V+8_

CdR^Z<qSO=*UT@"~hc:.t&xwf+5

5.請寫下這一節課你學習到的內容:格式不限,回憶並複述是加強記憶的好方式!


回复您的答案即可查看參考答案! 'JnH#r


動動手答案:版權屬於:bbs.fishc.com

本帖隱藏的內容

|[]TL}yKGM06;i72P]E!#[xq*)f1
0.編寫一個程序,統計當前目錄下每個文件類型的文件數。9[4brN
xZ[IR-cmL&=NtHJQr"<.n%K
代碼清單:Powered by bbs.fishc.com
')3$NDMxg}vFfU2*(EzAwe-j
  1. import os

  2. all_files = os.listdir(os.curdir) # 使用os.curdir表示當前目錄更標準
  3. type_dict = dict()

  4. for each_file in all_files:
  5.     if os.path.isdir(each_file):
  6.         type_dict.setdefault('文件夾', 0)
  7.         type_dict['文件夾'] += 1
  8.     else:
  9.         ext = os.path.splitext(each_file)[1]
  10.         type_dict.setdefault(ext, 0)
  11.         type_dict[ext] += 1

  12. for each_type in type_dict.keys():
  13.     print('該文件夾下共有類型為【%s】的文件%d 個' % (each_type, type_dict[each_type]))
複製代碼

Y$SgI[&CVR"io,GvXT]kuQ@b1
V^4+=hG)b<0EltZ3kK|:]Rxg,BC%$N
1.編寫一個程序,計算當前文件夾下所有文件的大小。&58Iqs$ g"
G|C1k=+#)w2​​Jz3X}L*WF?&>ve0I6
代碼清單:版權屬於:bbs.fishc.com
#gKm'DRG4~-!{wEqL.p%AzH_
  1. import os

  2. all_files = os.listdir(os.curdir) # 使用os.curdir表示當前目錄更標準
  3. file_dict = dict()

  4. for each_file in all_files:
  5.     if os.path.isfile(each_file):
  6.         file_size = os.path.getsize(each_file)
  7.         file_dict[each_file] = file_size

  8. for each in file_dict.items():
  9.     print('%s【%dBytes】' % (each[0], each[1]))
複製代碼

g{`!;97S<0u6hUl3}dCr+Li&_NG(ke
tD7v`ma~9HuO!o%d@eKrkpM>
2.編寫一個程序,用戶輸入文件名以及開始搜索的路徑,搜索該文件是否存在。如遇到文件夾,則進入文件夾繼續搜索,程序實現如圖:Mu0m?
{$}[#tz=l Nd1*5:H^&k%v@ro
代碼清單:Powered by bbs.fishc.com
a]# *s{t~:&GJI^-w9E?KTV5C[
  1. import os

  2. def search_file(start_dir, target) :
  3.     os.chdir(start_dir)
  4.    
  5.     for each_file in os.listdir(os.curdir) :
  6.         if each_file == target :
  7.             print(os.getcwd() + os.sep + each_file) # 使用os.sep是程序更標準
  8.         if os.path.isdir(each_file) :
  9.             search_file(each_file, target) # 遞歸調用
  10.             os.chdir(os.pardir) # 遞歸調用後切記返回上一層目錄

  11. start_dir = input('請輸入待查找的初始目錄:')
  12. target = input('請輸入需要查找的目標文件:')
  13. search_file(start_dir, target)
複製代碼

p}vU"O>gEmJqFy;9j^VC?r`63
!u',hXB fzQ@&-]^r20s78b1vMU
3.編寫一個程序,用戶輸入開始搜索的路徑,查找該路徑下(包含子文件夾內)所有的視頻格式文件(要求查找mp4 rmvb, avi的格式即可),並把創建一個文件(vedioList.txt)存放所有找到的文件的路徑,程序實現如圖:D v)-"'(1
*ZTYCH^FK<1SNR)E!r6u?,lah~q3L5
代碼清單:來自:bbs.fishc.com
'*s)iT>4GW_J@l!f{R^2O-
  1. import os

  2. def search_file(start_dir, target) :
  3.     os.chdir(start_dir)
  4.    
  5.     for each_file in os.listdir(os.curdir) :
  6.         ext = os.path.splitext(each_file)[1]
  7.         if ext in target :
  8.             vedio_list.append(os.getcwd() + os.sep + each_file + os.linesep) # 使用os.sep是程序更標準
  9.         if os.path.isdir(each_file) :
  10.             search_file(each_file, target) # 遞歸調用
  11.             os.chdir(os.pardir) # 遞歸調用後切記返回上一層目錄

  12. start_dir = input('請輸入待查找的初始目錄:')
  13. program_dir = os.getcwd()

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

  16. search_file(start_dir, target)

  17. f = open(program_dir + os.sep + 'vedioList.txt', 'w')
  18. f.writelines(vedio_list)
  19. f.close()
複製代碼

SG% >`w#e6Zc=rjIO;Wok,R8bU~aHQ
9{<|gOX>radioJjI7zGP!}
4.編寫一個程序,用戶輸入關鍵字,查找當前文件夾內(如果當前文件夾內包含文件夾,則進入文件夾繼續搜索)所有含有該關鍵字的文本文件(.txt後綴),要求顯示該文件所在的位置以及關鍵字在文件中的具體位置(第幾行第幾個字符),程序實現如圖:+uR5cC=

代碼清單:
  1. import os

  2. def print_pos(key_dict):
  3.     keys = key_dict.keys()
  4.     keys = sorted(keys) # 由於字典是無序的,我們這裡對行數進行排序
  5.     for each_key in keys:
  6.         print('關鍵字出現在第%s 行,第%s 個位置。' % (each_key, str(key_dict[each_key])))


  7. def pos_in_line(line, key):
  8.     pos = []
  9.     begin = line.find(key)
  10.     while begin != -1:
  11.         pos.append(begin + 1) # 用戶的角度是從1開始數
  12.         begin = line.find(key, begin+1) # 從下一個位置繼續查找

  13.     return pos


  14. def search_in_file(file_name, key):
  15.     f = open(file_name)
  16.     count = 0 # 記錄行數
  17.     key_dict = dict() # 字典,用戶存放key所在具體行數對應具體位置
  18.    
  19.     for each_line in f:
  20.         count += 1
  21.         if key in each_line:
  22.             pos = pos_in_line(each_line, key) # key在每行對應的位置
  23.             key_dict[count] = pos
  24.    
  25.     f.close()
  26.     return key_dict


  27. def search_files(key, detail):   
  28.     all_files = os.walk(os.getcwd())
  29.     txt_files = []

  30.     for i in all_files:
  31.         for each_file in i[2]:
  32.             if os.path.splitext(each_file)[1] == '.txt': # 根據後綴判斷是否文本文件
  33.                 each_file = os.path.join(i[0], each_file)
  34.                 txt_files.append(each_file)

  35.     for each_txt_file in txt_files:
  36.         key_dict = search_in_file(each_txt_file, key)
  37.         if key_dict:
  38.             print('=============================================== =================')
  39.             print('在文件【%s】中找到關鍵字【%s】' % (each_txt_file, key))
  40.             if detail in ['YES', 'Yes', 'yes']:
  41.                 print_pos(key_dict)


  42. key = input('請將該腳本放於待查找的文件夾內,請輸入關鍵字:')
  43. detail = input('請問是否需要打印關鍵字【%s】在文件中的具體位置(YES/NO):' % key)
  44. search_files(key, detail)
複製代碼


5.請寫下這一節課你學習到的內容:格式不限,回憶並複述是加強記憶的好方式!

小甲魚希望你認真對待作業就像你希望小甲魚推出高質量視頻一樣渴望^_^

介紹跟Python的文件相關且十分有用的模塊。模塊是什麼?
模塊是一個包含你定義的函數和變量的文件,後綴是.py,模塊可以做到被別的程序所引入,以使用該模塊中的函數等功能。
OS模塊(Operating System操作系統)
對於文件系統的訪問來說,Python一般是提供OS模塊來實現就可以了,我們所知道常用的操作系統有:Windows,Mac OS,Linux,UNIX等,這些操作系統底層由於文件系統的訪問工作原理不同,因此你可能就要針對不同的系統來考慮使用哪些文件系統模塊....這樣的做法是非常不友好且麻煩的,因為這樣就意味著當你的程序運行環境一改變,你就要相應的去修改大量的代碼來應付。但是我們的Python是跨平台的,所以Python就有了這個OS模塊。
有了OS模塊,我們不需要關心什麼操作系統下使用什麼模塊,OS模塊會幫你選擇正確的模塊並調用。

os模塊中關於文件/目錄常用的函數使用方法

函數名
使用方法
getcwd()返回當前工作目錄
chdir(path)改變工作目錄
listdir(path='.')列舉指定目錄中的文件名('.'表示當前目錄,'..'表示上一級目錄)
mkdir(path)創建單層目錄,如該目錄已存在拋出異常
makedirs(path)遞歸創建多層目錄,如該目錄已存在拋出異常,注意:'E:\\a\\b'和'E:\\a\\c'並不會衝突
remove(path)刪除文件
rmdir(path)刪除單層目錄,如該目錄非空則拋出異常
removedirs(path)遞歸刪除目錄,從子目錄到父目錄逐層嘗試刪除,遇到目錄非空則拋出異常
rename(old, new)將文件old重命名為new
system(command)運行系統的shell命令
walk(top)遍歷top路徑以下所有的子目錄,返回一個三元組:(路徑, [包含目錄], [包含文件])【具體實現方案請看:第30講課後作業^_^】
以下是支持路徑操作中常用到的一些定義,支持所有平台
os.curdir指代當前目錄('.')
os.pardir指代上一級目錄('..')
os.sep輸出操作系統特定的路徑分隔符(Win下為'\\',Linux下為'/')
os.linesep當前平台使用的行終止符(Win下為'\r\n',Linux下為'\n')
os.name指代當前使用的操作系統(包括:'posix', 'nt', 'mac', 'os2', 'ce', 'java')

os.path模塊中關於路徑常用的函數使用方法

函數名
使用方法
basename(path)去掉目錄路徑,單獨返回文件名
dirname(path)去掉文件名,單獨返回目錄路徑
join(path1[, path2[, ...]])將path1, path2各部分組合成一個路徑名
split(path)分割文件名與路徑,返回(f_path, f_name)元組。如果完全使用目錄,它也會將最後一個目錄作為文件名分離,且不會判斷文件或者目錄是否存在
splitext(path)分離文件名與擴展名,返回(f_name, f_extension)元組
getsize(file)返回指定文件的尺寸,單位是字節
getatime(file)返回指定文件最近的訪問時間(浮點型秒數,可用time模塊的gmtime()或localtime()函數換算)
getctime(file)返回指定文件的創建時間(浮點型秒數,可用time模塊的gmtime()或localtime()函數換算)
getmtime(file)返回指定文件最新的修改時間(浮點型秒數,可用time模塊的gmtime()或localtime()函數換算)
以下為函數返回True 或False
exists(path)判斷指定路徑(目錄或文件)是否存在
isabs(path)判斷指定路徑是否為絕對路徑
isdir(path)判斷指定路徑是否存在且是一個目錄
isfile(path)判斷指定路徑是否存在且是一個文件
islink(path)判斷指定路徑是否存在且是一個符號鏈接(在windows上即為快捷方式)
ismount(path)判斷指定路徑是否存在且是一個掛載點
samefile(path1, paht2)判斷path1和path2兩個路徑是否指向同一個文件



0 留言:

發佈留言