當我面有數據需要保存時,第一時間一般會想到寫到一個txt文件中,當然,數據量比較大的時候還是寫到數據庫比較方便管理,需要進行網絡傳輸時要序列化,json化。下面主要整理一下平時用的最多的寫入到文件中,一般以txt結尾,linux里不會以后綴來區分文件類型,后綴可以隨便,也可以沒有。
python讀寫文件估計大家都用open內置函數,或者file這個工廠函數,這兩個的效果基本一樣。
打開文件的方式一般為:f=open(file_name,access_mode = 'r',buffering = -1)。file_name就是文件的路徑加文件名字,不加路徑則文件會存放在python程序的路徑下,
access_mode就是操作文件的模式,主要有r,w,rb,wb等,細節網上一大堆,buffering = -1是用於指示訪問文件所采用的緩存方式。0表示不緩存;1表示只緩存一行,n代表緩存n行。如果不提供或為負數,則代表使用系統默認的緩存機制。
打開以后就是寫和讀的操作。但是用open方法打開會有一些問題。open打開文件只能寫入str類型,不管字符串是什么編碼方式。例如
>>> fr = open('test.txt','a')
>>> line1 = "我愛祖國"
>>> fr.write(line1)
這樣是完全可以的。但是有時候我們爬蟲或者其他方式得到一些數據寫入文件時會有編碼不統一的問題,所以就一般都統一轉換為unicode。此時寫入open方式打開的文件就有問題了。例如
>>> line2 = u'我愛祖國'
>>> fr.write(line2)
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
fr.write(line2)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-11: ordinal not in range(128)
>>>
怎么辦,我們可以將上面的line2編碼成str類型,但是太麻煩。我們要把得到的東西先decode為unicode再encode為str。。。
input文件(gbk, utf-8...) ----decode-----> unicode -------encode------> output文件(gbk, utf-8...)
代替這繁瑣的操作就是codecs.open,例如
>>> import codecs
>>> fw = codecs.open('test1.txt','a','utf-8')
>>> fw.write(line2)
>>>
不會報錯,說明寫入成功。這種方法可以指定一個編碼打開文件,使用這個方法打開的文件讀取返回的將是unicode。寫入時,如果參數 是unicode,則使用open()時指定的編碼進行編碼后寫入;如果是str,則先根據源代碼文件聲明的字符編碼,解碼成unicode后再進行前述 操作。相對內置的open()來說,這個方法比較不容易在編碼上出現問題。
總結一下:文件讀盡量用第二種方法,一般不會出現編碼的問題。至於用第二種方法有什么缺點,我沒有研究過。。
