【Python】 文件和操作文件方法
文件
■ 基本的文件用法
f = open("path","mode") mode有a,w,r,b,+等。默認為r。模式與打開文件時的動作有關系,比如用w打開的話肯定會清空文件再寫,而a的話打開時就不會清空文件而是直接append內容
關于文件的打開模式,我有一句mmp一定要講。。眾所周知,在windows中換行符是\r\n,在unix中換行符是\n,而python做了一個事就是在一般的寫模式下寫文件的時候,自動根據當前的操作系統類型進行換行符的轉換。這么一來有時候想要在windows下寫完文件再傳送到unix系統中就導致了這個文件再unix中不可直接調用。解決的方法就是把open("file","w")換成open("file","wb+"),加上b之后python就不知道寫的文件是文本文件還是什么就不會輕易地做換行符的轉換了。
f.read()/write(...)
f.close()
在很多示例中,打開文件用的都是這樣一種方法:
with open("path","mode") as f:
f.操作
不用再手動關閉文件什么的,這個涉及到with這個上下文管理語句,現在還不是很懂,等以后有機會再來研究一下。
■ 讀的方法
f.read(...) 讀...個字符,無參數則讀取整個文件
f.readline() 讀取一行,如果有參數就是讀取這行的前n個字符,每行包括換行符在內!
f.readlines() 讀取一個由行組成的列表,每行也都有換行符
*因為程序是以流的形式讀取文件的,所以在readline,read這種一點一點讀取的方法里,讀取完一部分后再讀取就自動接續到下一部分了。
f.seek(offset[,whence]) seek方法指定文件讀取指針位置。whence參數可選0,1或2分別代表文件開頭,指針當前位置和文件結尾。offset設置一個數,可正可負,表示從whence設置的位置向前或向后偏移多少個字節開始讀取文件內容。whence默認是0。因為可以重設指針位置,seek方法常用于文件流讀取到一定程度后回過頭再去讀取或者跳過一部分內容讀取、直接讀取文件末尾部分等場景。比如f.seek(-128,2)的意思就是將文件讀取指針設置到文件末尾前的128個字節處,之后再f.read()就可以直接讀到文件最后128個字節的內容了。
?
■ 寫的方法
f.write(...)
f.writelines([..,..,..]) 與readlines相反,用write將一個列表寫進文件,注意的是writelines不會再每個元素后面自動加上換行回車,所以要手動地加上\n
?
■ 三個特別的類文件對象
stdin, stdout, stderr是sys的三個類文件對象,所謂類文件,就是說它們可以像一個文件一樣去read和write,比如:
sys.stdin.readlines()
sys.stdout.write(...)
sys.stderr.write(...)
?
■ 對文件內容的遍歷
●? 按字節處理
用read(1)對字符做一個遍歷,循環的條件可以是while char != ""來判斷是不是把文件讀完了
●? 按行處理
用readline()對行做遍歷,循環的條件可以是while line != ""。
需要注意的是readline每次只讀一行,肯定效率比readlines要低一點,但是碰到很大的文件,沒辦法用readlines一次性讀進內存的話,可以考慮用readline來遍歷
●? 更簡便的寫法
python中的文件是個可迭代的對象。這意味著我們也可以這么寫:
for line in test_file:
process(line)
也就是說如果默認按照行來處理的話,甚至都可以不用寫open來打開語句
■ 文件對象的flush方法
寫入文件時,并不是調用一次write方法就馬上寫入的??梢栽囋嚳?#xff1a;
for i in range(5):sys.stdout.write("hello\n")time.sleep(1)?
會發現,這段代碼要等5秒后才會把5行hello一起輸出。這是因為調用write方法的時候先把待寫入內容放入了緩存中。如果想要一秒就看到一條輸出的話可以在sleep前面加上一個sys.stdout.flush()來清空緩存并寫入內容。
說到這個順便說一下,文件對象也會有很多自帶的屬性。flush是一個,其他還有一些比如
file.closed 返回布爾值,判斷文件是否被關閉了
file.mode 返回文件被打開的方式
file.name 返回文件名
file.softspace 返回一個布爾值,如果是False就意味著文件在用print語句(或函數)進行輸出的時候末尾會帶一個空格符,一般不太用這個屬性
?
■ 寫入文件時的編碼
在寫入文件時,如果源數據是unicode格式的,那么在寫入時python會自動用一個編碼格式來把unicode編碼再寫入。然而這個編碼格式往往就是ascii,這就導致了會有UnicodeEncodeError,為了解決這個問題,一個很好的辦法就是在open文件的時候指定好編碼。
網上有不少說builtin的open函數是帶有encoding這個參數的,然而我試了下發現并不行??梢缘姆椒ㄊ莍mport codecs之后用codecs.open,這個方法的第三個參數是編碼格式,就可以指定了。
轉載于:https://www.cnblogs.com/franknihao/p/6616811.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的【Python】 文件和操作文件方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python(2)-- 运算符
- 下一篇: mongo connections ur