零基礎學習python_文件(28-30課)


  本人小白一枚,隨着現在對測試要求越來越高,動不動就要去會一門編程語言,沒辦法只能學習學習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。

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM