一個任務:(小甲魚python視頻第29講) 代碼整理與總結


  任務:將文件(record.txt)中的數據進行分割,並安裝以下規則保存起來。
  1.小甲魚的對話單獨保存為boy_*.txt的文件(去掉"小甲魚:")
  2.小客服的對話單獨保存為girl_*.txt的文件(去掉"小客服:")
  3.文件中總共有三段對話,分別保存為boy_1.txt、boy_2.txt、boy_3.txt、gilr_1.txt、gilr_2.txt、gilr_3.txt
      共6個文件。(提示:不同的對話已經使用"===="進行分割)

  代碼清單1:

#打開record.txt文件
f = open('E:\\python\\record.txt')  

#定義3個變量,並對它們初始化
boy = []     
girl = []
count = 0

#循環讀取文件
for each_line in f:
  
  #如果當前內容不"======",則繼續讀取內容;否則讀取,開始寫操作
  if each_line[:6] != "======":            
    
    #讀取的內容以":"進行分割,分割后分別賦值給元組元素role和spoken
    (role,spoken) = each_line.split(':',1) 
    
    #如果對話角色為"小甲魚",則將文件追加到boy列表中
    if role == '小甲魚':                  
       boy.append(spoken)
       
    #如果對話角色為"小客服",則將文件追加到girl列表中
    if role == '小客服':                   
       girl.append(spoken)
  else:
     #定義輸出文件名稱
     file_name_boy = 'boy_'+str(count)+'.txt'  
     file_name_girl = 'girl'+str(count)+'.txt' 
    
     #打開文件
     boy_file = open(file_name_boy,'w')         
     girl_file = open(file_name_girl,'w')     
     
     #writelines的參數是序列(比如列表),它會迭代幫你寫入文件。
     boy_file.writelines(boy)     
     girl_file.writelines(girl) 
     
     #關閉文件對象
     boy_file.close()                                   
     girl_file.close()                          
     
     #當前寫操作完畢后,必須進行初始化操作,以准備下一個的寫入操作
     boy = []
     girl = []
     count += 1

#因為第三段對話的結尾沒有"===",所以需要再次進行上門的重復寫操作,保存第三段對話
#定義輸出文件名稱     
file_name_boy = 'boy_'+str(count)+'.txt'  
file_name_girl = 'girl'+str(count)+'.txt'  

#打開文件    
boy_file = open(file_name_boy,'w')         
girl_file = open(file_name_girl,'w') 

#writelines的參數是序列(比如列表),它會迭代幫你寫入文件。     
boy_file.writelines(boy)   
girl_file.writelines(girl) 

#關閉文件對象      
boy_file.close()                                
girl_file.close()                    

#關閉文件對象
f.close()   

  代碼清單2:

#定義一個保存文件的方法
def save_file(boy,girl,count):

   #定義輸出文件名稱
   file_name_boy = 'boy_'+str(count)+'.txt'   
   file_name_girl = 'girl'+str(count)+'.txt'
   
   #打開文件
   boy_file = open(file_name_boy,'w')         
   girl_file = open(file_name_girl,'w')
   
   #writelines的參數是序列(比如列表),它會迭代幫你寫入文件。   
   boy_file.writelines(boy)     
   girl_file.writelines(girl)  
   
   #關閉文件對象     
   boy_file.close()                                  
   girl_file.close() 

#定義一個讀取和分割文件內容的方法   
def read_file(filename):
   
   #打開record.txt文件
   f = open('E:\\python\\record.txt')  

   #定義3個變量,並對它們初始化
   boy = []     
   girl = []
   count = 0

   #循環讀取文件
   for each_line in f:
   
   #如果當前內容不"======",則繼續讀取內容;否則讀取,開始寫操作
   if each_line[:6] != "======": 

      #讀取的內容以":"進行分割,分割后分別賦值給元組元素role和spoken   
      (role,spoken) = each_line.split(':',1)
      
      #如果對話角色為"小甲魚",則將文件追加到boy列表中
      if role == '小甲魚':                 
         boy.append(spoken)
    
      #如果對話角色為"小客服",則將文件追加到girl列表中
      if role == '小客服':                 
         girl.append(spoken)
       
   else:
       #保存文件
       save_file(boy,girl,count)     

       #保存完文件后,再初始化變量       
       boy = []
       girl = []
       count += 1

   #因為第三段對話的結尾沒有"===",所以需要再調用save_file方法,保存第三段對話
   save_file(boy,girl,count)
   
   #關閉文件對象
   f.close()

#主方法:只要調用read_file就可以完成所有的操作
read_file('E:\\python\\record.txt')  

  問題延伸: 如下圖:為什么boy[]、girl[]、count位置不同,結果完全不同呢?

  

  原因分析:
   因為boy,girl,count三個變量是做為split_file()函數的局部變量,當把它們放在split_file()里面的時候,是對3個變量進行了初始化。
   但是當你把它們放到下面save_file()函數里面的時候,就是在save_file()函數里面重新定義了三個名叫boy, girl,count的變量,
   那么它和split_file()函數里面的變量是完全沒有關系的。

 


免責聲明!

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



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