內(nèi)容來(lái)源于網(wǎng)絡(luò),本人只是在此稍作整理邢羔,如有涉及版權(quán)問(wèn)題,歸小甲魚(yú)官方所有桑孩。
練習(xí)題(來(lái)自小甲魚(yú)官方論壇)
0.編寫(xiě)一個(gè)程序拜鹤,統(tǒng)計(jì)當(dāng)前目錄下每個(gè)文件類型的文件數(shù),程序?qū)崿F(xiàn)如圖:
文件類型數(shù).png
答:
import os
all_files = os.listdir(os.curdir) # 使用os.curdir表示當(dāng)前目錄更標(biāo)準(zhǔn)
type_dict = dict() # 先定一個(gè)空字典來(lái)存放{'后綴名': 數(shù)量}
for each_file in all_files:
if os.path.isdir(each_file):
type_dict.setdefault('文件夾', 0) # 當(dāng)原字典中無(wú)該鍵時(shí)流椒,則新增該鍵和對(duì)于的值敏簿,并返回鍵值
type_dict['文件夾'] += 1
else:
ext = os.path.splitext(each_file)[1] # 返回的是元組,獲取文件的后綴名=ext
type_dict.setdefault(ext, 0)
type_dict[ext] += 1
for each_type in type_dict.keys():
print('該文件夾下共有類型為【%s】的文件 %d 個(gè)' % (each_type, type_dict[each_type]))
輸出
該文件夾下共有類型為【文件夾】的文件 3 個(gè)
該文件夾下共有類型為【.png】的文件 1 個(gè)
該文件夾下共有類型為【.py】的文件 1 個(gè)
該文件夾下共有類型為【.lnk】的文件 14 個(gè)
該文件夾下共有類型為【.pptx】的文件 1 個(gè)
該文件夾下共有類型為【.ini】的文件 1 個(gè)
該文件夾下共有類型為【.exe】的文件 1 個(gè)
1. 編寫(xiě)一個(gè)程序,計(jì)算當(dāng)前文件夾下所有文件的大小惯裕,程序?qū)崿F(xiàn)如圖:
文件大小.png
答:
import os
def file_size():
file_name = os.listdir(os.curdir)
dict1 = dict()
for each_file in file_name:
if os.path.isfile(each_file):
dict1.setdefault(each_file, os.path.getsize(each_file))
print('%s的大小為:【%d Bytes】' % (each_file, dict1[each_file]))
file_size()
輸出:
111.py的大小為:【1240 Bytes】
1111.py的大小為:【338 Bytes】
2. 編寫(xiě)一個(gè)程序温数,用戶輸入文件名以及開(kāi)始搜索的路徑,搜索該文件是否存在蜻势。如遇到文件夾撑刺,則進(jìn)入文件夾繼續(xù)搜索,程序?qū)崿F(xiàn)如圖:
搜索文件是否存在.png
答:
import os
def search_file(start_dir, target):
os.chdir(start_dir) # 切換當(dāng)前工作目錄
for each_file in os.listdir(os.curdir):
if each_file == target:
print(os.getcwd() + os.sep + each_file) # 使用os.sep使程序更標(biāo)準(zhǔn)
if os.path.isdir(each_file):
search_file(each_file, target) # 遞歸調(diào)用
os.chdir(os.pardir) # 遞歸調(diào)用后切記返回上一層目錄
start_dir = input('請(qǐng)輸入待查找的初始目錄:')
target = input('請(qǐng)輸入需要查找的目標(biāo)文件:')
search_file(start_dir, target)
輸出:
請(qǐng)輸入待查找的初始目錄:E:\\python
請(qǐng)輸入需要查找的目標(biāo)文件:Linux基礎(chǔ).pdf
E:\python\Linux基礎(chǔ).pdf
E:\python\Python基礎(chǔ)班\Python基礎(chǔ)班資料\01-基礎(chǔ)班-第01天{Linux握玛、以及命令}\1-上課資料\pdf版\Linux基礎(chǔ).pdf
3. 編寫(xiě)一個(gè)程序够傍,用戶輸入開(kāi)始搜索的路徑,查找該路徑下(包含子文件夾內(nèi))所有的視頻格式文件(要求查找mp4, rmvb, avi的格式即可)挠铲,并把創(chuàng)建一個(gè)文件(vedioList.txt)存放所有找到的文件的路徑冕屯,程序?qū)崿F(xiàn)如圖:
根據(jù)后綴名查路徑.png
答:
import os
vedio_list = []
def search_file(start_dir):
os.chdir(start_dir)
for each_file in os.listdir(os.curdir):
if os.path.isfile(each_file):
file_ext = os.path.splitext(each_file)[1]
if file_ext in ['.mp4', '.rmvb', '.avi']:
vedio_list.append(os.getcwd() + os.sep + each_file + os.linesep)
if os.path.isdir(each_file):
search_file(each_file) # 遞歸調(diào)用
os.chdir(os.pardir) # 遞歸調(diào)用后切記返回上一層目錄
return vedio_list
start_dir = input('請(qǐng)輸入待查找的初始目錄:')
vedio_list = search_file(start_dir)
f = open(os.getcwd() + os.sep + 'VedioList.txt', 'w')
f.writelines(vedio_list)
f.close()
輸出:
E:\123\111.mp4
E:\123\1111\123.avi
E:\123\112\1234\weq.rmvb
4. 編寫(xiě)一個(gè)程序,用戶輸入關(guān)鍵字拂苹,查找當(dāng)前文件夾內(nèi)(如果當(dāng)前文件夾內(nèi)包含文件夾愕撰,則進(jìn)入文件夾繼續(xù)搜索)所有含有該關(guān)鍵字的文本文件(.txt后綴),要求顯示該文件所在的位置以及關(guān)鍵字在文件中的具體位置(第幾行第幾個(gè)字符)醋寝,程序?qū)崿F(xiàn)如圖:
5.png
答:
import os
def print_pos(key_dict): # 負(fù)責(zé)打印
keys = key_dict.keys()
keys = sorted(keys) # 由于字典是無(wú)序的搞挣,我們這里對(duì)行數(shù)進(jìn)行排序
for each_key in keys:
print('關(guān)鍵字出現(xiàn)在第 %s 行,第 %s 個(gè)位置音羞。' % (each_key, str(key_dict[each_key])))
def pos_in_line(line, key):
pos = []
begin = line.find(key)
while begin != -1:
pos.append(begin + 1) # 用戶的角度是從1開(kāi)始數(shù)
begin = line.find(key, begin + 1) # 從下一個(gè)位置繼續(xù)查找
return pos
def search_in_file(file_name, key):
f = open(file_name)
count = 0 # 記錄行數(shù)
key_dict = dict() # 字典囱桨,用戶存放key所在具體行數(shù)對(duì)應(yīng)具體位置
for each_line in f:
count += 1
if key in each_line:
pos = pos_in_line(each_line, key) # key在每行對(duì)應(yīng)的位置
key_dict[count] = pos
f.close()
return key_dict
def search_files(key, detail):
all_files = os.walk(os.getcwd())
txt_files = []
for i in all_files:
for each_file in i[2]:
if os.path.splitext(each_file)[1] == '.txt': # 根據(jù)后綴判斷是否文本文件
each_file = os.path.join(i[0], each_file)
txt_files.append(each_file)
for each_txt_file in txt_files:
key_dict = search_in_file(each_txt_file, key)
if key_dict:
print('================================================================')
print('在文件【%s】中找到關(guān)鍵字【%s】' % (each_txt_file, key))
if detail in ['YES', 'Yes', 'yes', 'Y', 'y']:
print_pos(key_dict)
key = input('請(qǐng)將該腳本放于待查找的文件夾內(nèi),請(qǐng)輸入關(guān)鍵字:')
detail = input('請(qǐng)問(wèn)是否需要打印關(guān)鍵字【%s】在文件中的具體位置(YES/NO):' % key)
search_files(key, detail)
輸出:
請(qǐng)將該腳本放于待查找的文件夾內(nèi)嗅绰,請(qǐng)輸入關(guān)鍵字:Linux
請(qǐng)問(wèn)是否需要打印關(guān)鍵字【Linux】在文件中的具體位置(YES/NO):y
================================================================
在文件【E:\python\study\312\121.txt】中找到關(guān)鍵字【Linux】
關(guān)鍵字出現(xiàn)在第 1 行舍肠,第 [6, 16] 個(gè)位置。
關(guān)鍵字出現(xiàn)在第 2 行窘面,第 [3] 個(gè)位置翠语。
關(guān)鍵字出現(xiàn)在第 3 行,第 [7] 個(gè)位置财边。
5.請(qǐng)寫(xiě)下這一節(jié)課你學(xué)習(xí)到的內(nèi)容:格式不限肌括,回憶并復(fù)述是加強(qiáng)記憶的好方式!
- OS模塊中關(guān)于文件/目錄常用的函數(shù)使用方法
函數(shù)名 | 使用方法 |
---|---|
getcwd() | 返回當(dāng)前工作目錄 |
chdir() | 改變工作目錄 |
listdir(path='.') | 列舉指定目錄中的文件名('.'表示當(dāng)前目錄酣难,'..'表示上一級(jí)目錄) |
mkdir(path) | 創(chuàng)建單層目錄谍夭,如果目錄已存在拋出異常 |
makedirs(path) | 遞歸創(chuàng)建多層目錄,如果該目錄已存在則拋出異常憨募,注意:'E:\a\b'和'E:\a\c'并不會(huì)沖突) |
remove(path) | 刪除文件 |
rmdir(path) | 刪除單層目錄紧索,如果該目錄非空則拋出異常 |
removedirs(path) | 遞歸刪除目錄,從子目錄到父目錄逐層嘗試刪除菜谣,遇到目錄非空則拋出異常 |
rename(old,new) | 將文件old重命名為new |
system(command) | 運(yùn)行系統(tǒng)的shell命令 |
walk(top) | 遍歷top參數(shù)指定路徑下的所有子目錄珠漂,并將結(jié)果返回一個(gè)三元組(路徑晚缩,[目錄](méi),[文件]) |
以下是支持路徑操作中常用到的一些定義媳危,支持所有平臺(tái)
函數(shù)名 | 使用方法 |
---|---|
os.curdir | 指代當(dāng)前目錄 |
os.pardir | 指代上一級(jí)目錄 |
os.sep | 輸出操作系統(tǒng)特定的路徑分隔符(在Windows下為'\'橡羞,Linux下為'/') |
os.linesep | 當(dāng)前平臺(tái)使用的行終止符(在Windows下為'\r\n',Linux下為'\n') |
os.name | 指代當(dāng)前使用的操作系統(tǒng)(包括'posix'济舆、'nt'卿泽、'mac'、'os2'滋觉、'ce'签夭、'java') |
- os.path模塊中關(guān)于路徑常用的函數(shù)使用辦法
函數(shù)名 | 使用方法 |
---|---|
basename(path) | 去掉目錄路徑,單獨(dú)返回文件名 |
dirname(path) | 去掉文件名椎侠,單獨(dú)返回目錄路徑 |
join(path1[,path2[,...]]) | 將path1和path2各部分組合成一個(gè)路徑名 |
split(path) | 分割文件名和路徑第租,返回(f_path, f_name)元組。如果完全使用目錄我纪,它也會(huì)將最后一個(gè)目錄作為文件名分離慎宾,且不會(huì)判斷文件或者目錄是否存在 |
splitext(path) | 分離文件名和擴(kuò)展名,返回(f_name, f_extension)元組浅悉。 |
getsize(file) | 返回指定文件的尺寸趟据,單位是字節(jié) |
getatime(file) | 返回指定文件最近的訪問(wèn)時(shí)間(浮點(diǎn)型秒數(shù),可用time模塊的gmtime()或localtime()函數(shù)換算) |
getctime(file) | 返回指定文件的創(chuàng)建時(shí)間(浮點(diǎn)型秒數(shù)术健,可用time模塊的gmtime()或localtime()函數(shù)換算) |
getmtime(file) | 返回指定文件最新的修改時(shí)間(浮點(diǎn)型秒數(shù)汹碱,可用time模塊的gmtime()或localtime()函數(shù)換算) |
以下為函數(shù)返回True或False
函數(shù)名 | 使用方法 |
---|---|
exists(path) | 判斷指定路徑(目錄或文件)是否存在 |
isabs(path) | 判斷指定路徑是否為絕對(duì)路徑 |
isdir(path) | 判斷指定路徑是否存在且是一個(gè)目錄 |
isfile(path) | 判斷指定路徑是否存在且是一個(gè)文件 |
islink(path) | 判斷指定路徑是否存在且是一個(gè)符號(hào)鏈接 |
ismount(path) | 判斷指定路徑是否存在且是一個(gè)掛載點(diǎn) |
samefile(path1,path2) | 判斷path1和path2兩個(gè)路徑是否指向同一個(gè)文件 |