python之文件操做

讀寫文件是最多見的IO操做。python

在磁盤上讀寫文件的功能都是由操做系統提供的,讀寫文件就是請求操做系統打開一個文件對象(一般稱之爲文件描述符),而後,經過操做系統提供的接口從這個文件對象中讀取數據(讀文件),或者把數據寫入這個文件對象(寫文件)。windows

讀文件:緩存

read([size]):讀取文件(讀取size字節,默認讀取所有)
readline([size]):讀取一行
readlines([size]) :讀取緩衝buf(io.DEFAULT_SET_BUFFER),返回每一行所組成的列表
iter:使用迭代器遍歷讀取文件 f.open(name);iter_f = iter(f);用for line in iter_f循環迭代器

  要以讀文件的模式打開一個文件對象,使用Python內置的open()函數,傳人文件名和標識符。函數

>>> f = open('/opt/test.txt','r')

  標識符'r'表示讀,若是文件不存在,open()函數就會拋出一個FileNotFoundError的錯誤,並提示文件不存在。測試

>>> f = open('test.txt','r')

Traceback (most recent call last):
  File "D:/Users/練習.py", line 305, in <module>
    f = open('test.txt','r')
FileNotFoundError: [Errno 2] No such file or directory: 'test.txt'

  文件打開成功,則調用read()方法能夠一次讀取文件的所有內容,Python把內容讀到內存,用str對象表示:close()方法關閉文件。文件使用完必須關閉,由於文件對象會佔用操做系統的資源,而且操做系統同一時間能打開的文件數量是有限的。編碼

f = open('test.txt','r')
print(f.read())
f.close()

hello world

  使用with語句能夠來自動幫咱們調用close()方法。操作系統

with open('test.txt','r') as f:
    print(f.read())

hello world

  調用read()會一次性讀取文件的所有內容,若是文件過大,內存就爆了,因此,保險起見,能夠反覆調用read(size)方法,每次最多讀取size個字節的內容。另外,readline()能夠每次讀取一行的內容,調用readlines()一次讀取全部內容並按行返回list。指針

  若是文件太小,read()一次性讀取最方便,若是不能肯定文件大小,能夠反覆調用read(size)比較保險,若是是配置文件,調用readlines()最方便。code

for line in f.readlines():
    print(line.strip()) # 把末尾的\n去除

  二進制文件視頻

  要讀取二進制文件,如圖片、視頻等,用‘rb’模式打開文件

with open('test.txt','rb') as f:
    print(f.read())

b'hello world\r\n\xe5\x88\xa4'

  字符編碼

  windows下默認編碼是gbk模式,要讀取utf-8編碼的文本文件,須要給open()函數傳人encoding參數

with open('test.txt','r',encoding='utf8') as f:
    print(f.read())

hello world
判斷下列

  遇到編碼不規範的文件,可能會碰到UnicodeDecodeError,這是因爲文本文件中可能夾雜了一些非法編碼的字符,open()函數還接收了一個errors參數,表示若是遇到編碼錯誤後如何處理,最簡單的方式就是直接忽略。

with open('test.txt','r',encoding='utf8',errors='ingore') as f:
    print(f.read())

寫文件:

write(str):將字符串寫入文件
writelines(sequence_of_strings):寫多行到文件,參數爲可迭代的對象
flush() 將存放再內存中的內容寫入硬盤。

  當調用write()時,Python解釋器調用系統想把內容寫到磁盤,但Linux內核有文件緩衝機制,因此會緩存到內核的緩存區,當調用close()或者flush()時纔會把內容寫到文件。或者寫入數據量大於或等於寫緩存,寫緩存也會同步到磁盤上。

  寫文件和讀文件同樣,都是調用open()函數,惟一區別就是標識符的傳人,'w',或者'wb'來表示寫文本文件或者寫二進制文件。

with open('t.txt','w') as f_w:
    f_w.write('hello world')

  寫入文件如不存在時,會直接建立該文件並進行寫入操做。若是文件裏面又內容時,會覆蓋掉原有的文件。

  追加文件內容則能夠傳入'a'參數。

 文件指針的操做:

seek(offset[,whwence]) 移動文件指針 # offset 偏移量,能夠爲負數。 whenc 偏移相對位置。有三種移動方式0,1,2,其中1和2必須在b模式下進行,但不管哪一種模式,都是以bytes爲單位移動的
tell 打印指針所在位置
truncate是截斷文件,因此文件的打開方式必須可寫,可是不能用w或w+等方式打開,由於那樣直接清空文件了,因此truncate要在r+或a或a+等模式下測試效果。

 

相關文章
相關標籤/搜索