如何用python在Windows系統下,生成UNIX格式文件

  平時測試工做中,少不了製造測試數據。最近一個項目,我就須要製造一批可在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)度,韶()光(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/
本文版權歸做者、微信公衆號光榮之路和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。

相關文章
相關標籤/搜索