平時測試工做中,少不了製造測試數據。最近一個項目,我就須要製造一批可在UNIX下正確讀取的文件。爲確保這批文件能從FTP下載成功,開發叮囑我:「文件中凡是遇到換行,換行符必須是UNIX下的LF,而不是Dos\Windows下的CRLF。」python
換行,在普通文檔編輯中,就是按下「Enter」鍵。在編寫代碼時,就是在文件中寫入字符串」\n」。但用python命令w在文件寫入換行」\n」之後,因爲是Windows系統的原故,會默認把」\n」實際保存爲」\r\n」。編程
對於Windows下爲什麼是」\r\n」,這裏引用網上的解釋:由於Windows採用了傳統的英文打字機模式,它在換行時需分解成兩步——回車」\r」和換行」\n」。回車(carriage return,CR)是將小車退回至起點,至關於把光標從行尾切換到行首,換行(line feed,LF)是將小車切換到下一行,這樣的組合操做就完成了另起一行的目的。微信
咱們首先確認Windows下的換行是否真的是CRLF:把文件用任意一款文本編輯器(以Notepad++爲例)打開,在編輯器的菜單欄中,找到「視圖」菜單,點擊「顯示符號」,勾選「顯示全部字符」,就能夠顯示換行符了。咱們在下圖中能夠看到,在Windows系統下,文件中的換行符確實是CRLF。編輯器
如何把CRLF變成LF呢?開發給出了一個解決方案。函數
Method A:學習
在Notepad++界面右下角,雙擊當前文件格式的描述:「Dos\Windows」,點擊彈框中的「轉換爲UNIX格式」,最後保存文件。此時能夠看到文件每行結尾都已經展現爲「LF」了。測試
雖然整個轉換過程極爲簡單,但要是有一大批這樣的文件須要一個個手動轉換,我不由感慨光(xīn)陰(hǎo)虛(lèi)度,韶(bù)光(xiǎng)易(dòng)逝。優化
在表達抗議後,開發表示能夠優化此方法,即便用文本編輯器的替換功能:編碼
Method B:spa
使用Notepad++打開原文件,按下組合鍵Ctrl+F後,在彈框中選擇「替換」欄,在「查找目標」輸入框填寫「\r\n」,「替換爲」輸入框填寫「\n」,「查找模式」選擇「擴展(\n\r\t\0\x...)」,點擊「替換全部打開文件」後,一一保存文件便可。
然而把全部的文件保存一遍,並不能提高測試的幸福感。我追求的是儘可能減小重複而繁重的手工勞動,解放雙手,高效測試!相似這樣的能力瓶頸,從我進入測試行業開始,就不斷擠佔着個人業餘時間。爲了更好的提升本身,系統地學習測試開發所必需的技能,我報名參加了吳老的測試開發培訓班。
截至目前,吳老已經授課兩個多月,我從無到有,學習了不少基本的python開發知識,也偶爾能接觸到一些巧妙的編程思惟。正好此次的數據準備,給我提供了一個實踐的契機,讓我運用最近學習的文件操做知識,體驗了一次局部自動化的樂趣。
下面給你們分享一下我此次愉快的實踐內容,因爲真實的測試數據略有複雜,這裏就用簡單的兩行數字來舉個栗子。
首先按上課所講的內容,依葫蘆畫瓢,使用Notepad++建立文件並寫入文本內容:
1 #coding:utf-8(設定文件編碼格式) 2 import os 3 import time 4 5 #切換到建立文件目錄 6 os.chdir(r"C:\Study\Chestnuts\01data") 7 8 #新建建立文件函數 9 def create_file(): 10 11 #構造文件名:以「年月日」爲文件名的.dat文件 12 t=time.localtime() 13 file_name=time.strftime("%Y-%m-%d",t)+".dat" 14 #建立並打開文件 15 fp=open(file_name,'w+') 16 #寫入文件內容 17 fp.writelines("12345\n") 18 fp.writelines("67890\n") 19 #關閉文件 20 fp.close() 21 22 #調用函數 23 create_file()
如上圖所示,執行腳本就會生成一份原始文件,不過在兩行內容的末尾,換行符均顯示爲CRLF,接下來就是轉換的工做了。
Method C:對原文件進行格式轉換
若是是對現有的文件進行處理,可使用Notepad++再編寫一個轉換的腳本。參考網上的方法,使用rU方式讀取文件內容,使用wb方式寫入文件內容,以下圖所示:
1 #coding:utf-8 2 import os 3 4 #文件路徑準備 5 route=r"C:\Study\Chestnuts\01data" 6 7 #遍歷路徑下目錄,文件夾,文件 8 for root,dirs,files in os.walk(route): 9 #遍歷文件 10 for name in files: 11 #概括文件名特徵 12 if name[-3:]=='dat': 13 #拼接文件名(目錄+文件名稱) 14 catalog=os.path.join(root,name) 15 #把全部行分割符替換爲換行符\n返回. 16 fp=open(catalog,"rU+") 17 #讀取文件並保存 18 strings=fp.read() 19 fp.close() 20 #使用二進制寫文件 21 fp1=open(catalog,"wb") 22 fp1.seek(0) 23 fp1.write(strings) 24 fp1.flush() 25 fp1.close()
執行這個腳本,就能對現有文件格式進行轉換,獲得換行符是LF的文件了。
結果是對了,但執行兩個腳原本生成一份最終文件,不免讓我以爲還不夠簡單。我分析了以上文件轉換的代碼,發現關鍵步驟是使用二進制(wb)方式寫入文件。
Method D:原文件使用二進制方式寫入
既然這樣,不如在一開始就使用二進制寫文件,一步到位!而且只需把源代碼中寫入方式(w)變成二進制寫入(wb)方式便可。你看,僅僅添加了一個字母,就省去了十幾行代碼,還達到了預期目標,可謂一舉多得!
#coding:utf-8(設定文件編碼格式) import os import time #切換到建立文件目錄 os.chdir(r"C:\Study\Chestnuts\01data") #新建建立文件函數 def create_file(): #構造文件名:以「年月日」爲文件名的.dat文件 t=time.localtime() file_name=time.strftime("%Y-%m-%d",t)+".dat" #建立並打開文件 fp=open(file_name,'wb+') #寫入文件內容 fp.writelines("12345\n") fp.writelines("67890\n") #關閉文件 fp.close() #調用函數 create_file()
窺一斑而見全豹,以上的代碼優化,提醒我編程時須要多思考,理清邏輯,最終找到達成目標的最佳方案。在練習編寫代碼時,不只要認真分析需求,分解步驟,也要注意積累好的方法進行沉澱,這也是我寫下本文的目的所在。
若是你們在測試工做中,也遇到了相似的困難,以爲本身能力欠缺,指望經過本身編寫代碼解決問題,歡迎你們諮詢我或者吳老。能夠加入咱們的「光榮之路python羣(457561756)」進行提問,也能夠來吳老的測試開發培訓班一塊兒學習。爲了更全面的提高,爲了更豐厚的待遇,也爲了更美好的生活,讓咱們在光榮之路一塊兒奮鬥!
做者:Flyleaves
出處:http://www.cnblogs.com/Flyleaves/
本文版權歸做者、微信公衆號光榮之路和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。