本人小白一枚,隨着現在對測試要求越來越高,動不動就要去會一門編程語言,沒辦法只能學習學習Python,今天看到幾個月前還是菜鳥的人突然就已經能使用Python寫簡單系統了,沒辦法,雖然之前也簡單學習過Python,但是還是怒了,最近一直再看魚C工作室的Python教程,為啥看這個?沒為啥,因為講解沒那么死板咯,於是乎就找這個視頻來看看,唯一的缺點就是練習題要錢,坑~~~~沒辦法,沒錢人家怎么繼續玩下去呢,好了不說廢話了,進入今天的主題,由於之前27課看過了,也沒寫博客,沒辦法只能從28課寫起了,如果日后感覺還可以的話再補吧!注意:Python是3+版本的喔
今天主要講的是Python操作文件,大家想一下既然是文件那我們肯定要“打開”啊是不是,打開那英文單詞是啥?Open對不對,沒錯啦,那打開啥呢?所以open后面是不是得加文件路徑?沒錯,那接着文件打開了那你是想干嘛呢?(讀、寫?)所以,最基本的打開兩個要素就來了唄,如下,一般open(‘文件路徑’,‘打開方式’)這樣既可,其余默認。

如果我們open時打開模式不填寫就代表只讀,即為'r',來看一看下面,這么多種打開模式總有你喜歡的吧^-^

哎呀呀,打開完文件后,那你想下我們要干嘛呢?讀文件內容或者寫東西進入文件對不?因此就有了下面方法,哎,專業術語叫文件對象方法,老記不住專業名稱,你們可得記住喲!還有雖然Python有垃圾回收機制,但是我們編輯讀取文件時,完成操作后記得關閉文件喲,不然突然斷電那內存內的數據可是會不見的喔,因為我們編輯的時候是保存在內存的,只有關閉文件時才會保存到本地!

說了這么多,接下來有道題目很好玩。嘗試着去完成吧^-^
任務:將文件(record.txt)中的數據進行分割並按照以下規律保存起來:
小甲魚的對話單獨保存為boy_*.txt的文件(去掉“小甲魚:”)
小客服的對話單獨保存為girl_*.txt的文件(去掉“小客服:”)
文件中總共有三段對話,分別保存為boy_1.txt, girl_1.txt,boy_2.txt, girl_2.txt, boy_3.txt, gril_3.txt共6個文件(提示:文件中不同的對話間已經使用“==========”分割)
record.txt文件內容如下:
小客服:小甲魚,今天有客戶問你有沒有女朋友? 小甲魚:咦?? 小客服:我跟她說你有女朋友了! 小甲魚:。。。。。。 小客服:她讓你分手后考慮下她!然后我說:"您要買個優盤,我就幫您留意下~" 小甲魚:然后呢? 小客服:她買了兩個,說發一個貨就好~ 小甲魚:呃。。。。。。你真牛! 小客服:那是,誰讓我是魚C最可愛小客服嘛~ 小甲魚:下次有人想調戲你我不阻止~ 小客服:滾!!! ================================================================================ 小客服:小甲魚,有個好評很好笑哈。 小甲魚:哦? 小客服:"有了小甲魚,以后媽媽再也不用擔心我的學習了~" 小甲魚:哈哈哈,我看到丫,我還發微博了呢~ 小客服:嗯嗯,我看了你的微博丫~ 小甲魚:喲西~ 小客服:那個有條回復“左手拿著小甲魚,右手拿著打火機,哪裡不會點哪裡,so easy ^_^” 小甲魚:T_T ================================================================================ 小客服:小甲魚,今天一個會員想找你 小甲魚:哦?什么事? 小客服:他說你一個學生月薪已經超過12k了!! 小甲魚:哪里的? 小客服:上海的 小甲魚:那正常,哪家公司? 小客服:他沒說呀。 小甲魚:哦 小客服:老大,為什么我工資那么低啊??是時候漲漲工資了!! 小甲魚:啊,你說什么?我在外邊呢,這里好吵吖。。。。。。 小客服:滾!!!
以上即為文件內容,嘗試着寫出上面的代碼吧,答案如下:
#coding=utf-8 def writefile(girl_list,boy_list,count): girl_file = open(r'D:\girl_'+ str(count) +'.txt','w') boy_file = open(r'D:\boy_'+ str(count) +'.txt','w') girl_file.writelines(girl_list) boy_file.writelines(boy_list) girl_file.close() boy_file.close() def split_file(): boy_list = [] girl_list = [] count = 1 f = open(r'D:\record.txt') for each_line in f: if each_line[:6] != '======': (name,content) = each_line.split(':',1) if name == '小客服': girl_list.append(each_line) else: boy_list.append(each_line) else: writefile(girl_list,boy_list,count) boy_list.clear() girl_list.clear() count += 1 writefile(girl_list,boy_list,count) f.close() split_file()
上面的代碼只是個人寫的而已,記住代碼的寫法沒有最好,只有更好,努力優化自己的代碼吧。好了,介紹了文件的基本讀寫,那么接下來就應該介紹下相對應的文件系統了。

大家千萬不要煩惱,沉住氣看完,看完后我會在后面留幾道題鞏固大家學習,一起努力吧!

附帶幾個題目,大家可以完成下看看,最后一個稍微有點復雜:
1、編寫一個程序,統計目錄下每個文件類型的文件數;
2、編寫一個程序,用戶輸入文件名以及開始搜索的路徑,搜索該文件是否存在,如遇到文件夾則進入文件夾繼續搜索。
3、編寫一個程序,用戶輸入關鍵字,查找當前文件夾內(如果當前文件夾內包含文件夾則進入文件夾繼續搜索)所有含有該關鍵字的文本文件(.txt后綴),要求顯示該文件所在的位置以及關鍵字在文件中的具體位置(第幾行第幾個字符)
答案:
第一題答案:
#coding=utf-8 #1:編寫一個程序,統計當前目錄下每個文件類型的文件數 import os import os.path as op def file_num(mulu_role='D:\\'): file_houzhui = [] filejia_count = 0 for wenjian in os.listdir(mulu_role): file_luji = op.join(mulu_role,wenjian) print(wenjian) if op.isdir(file_luji): filejia_count += 1 else: (filename_first,filename_last) = op.splitext(wenjian) file_houzhui.append(filename_last) if filejia_count >= 1: print('該文件下共有類型為【文件夾】的文件 %d個' %(filejia_count)) houzhui = list(set(file_houzhui)) for file_leixing in houzhui: file_count = file_houzhui.count(file_leixing) print('該文件下共有類型為【%s】的文件 %d個' %(file_leixing,file_count)) mulu_role = input('請輸入你想查詢的目錄(默認D盤):') file_num(mulu_role)
第二題答案:
#coding=utf-8 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) #sep是路徑分隔符 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)
第三題答案:
#coding=utf-8 import os def print_pos(key_dict): keys = key_dict.keys() keys = sorted(keys) #由於字典是無序的,這里對行數進行排序 for each_key in kyes: print('關鍵字出現在第 %s 行,第 %s 個位置。'%(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開始數 begin = line.find(key,begin+1) #從下一個位置繼續查找 return pos def search_in_file(file_name,key): f = open(file_name) count = 0 #記錄行數 key_dict = dict() #用戶存放key所在具體行數對應具體位置 for each_line in f: count += 1 if key in each_line: pos = pos_in_line(each_line,key) #key每行對應的位置 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': #根據后綴判斷是否文本文件 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】中找到關鍵字【%s】'%(each_txt_file,key)) if detail in ['YES','Yes','yes']: print_pos(key_dict) key = input('請將該腳本放於待查找的文件夾內,請輸入關鍵字:') detail = input('請問是否需要打印關鍵字【%s】在文件中的具體位置(YES/NO):'%key) search_files(key,detail)
注明:該文檔的圖片來自於魚C工作室的視頻,地址為:http://blog.fishc.com/category/python。
