文件操做

文件操做

一、介紹python

計算機系統分爲,計算機硬件,操做系統,應用程序 三部分緩存

咱們用python或其餘語言編寫的應用程序若想要把數據永久保存下來,必需要保存於硬盤中,這就涉及到應用程序要操做硬件,衆所周知,應用程序是沒法直接操做硬件的,這就用到了操做系統。操做系統把複雜的硬件操做封裝成簡單的接口給用戶/應用程序使用,其中文件就是操做系統提供給應用程序來操做硬盤虛擬概念,用戶或應用程序經過操做文件,能夠將本身的數據永久保存下來。函數

有了文件的概念,咱們無需再去考慮操做硬盤的細節,只須要關注操做文件的流程操作系統

讀文件

# 默認打開文件的模式:rt  read text

打開一個文件用open()方法(open()返回一個文件對象,它是可迭代的):指針

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

r表示是文本文件,rb是二進制文件。(這個mode參數默認值就是r)code

若是文件不存在,open()函數就會拋出一個IOError的錯誤,而且給出錯誤碼和詳細的信息告訴你文件不存在:對象

f=open('test.txt', 'r')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: 'test.txt'

文件使用完畢後必須關閉,由於文件對象會佔用操做系統的資源,而且操做系統同一時間能打開的文件數量也是有限的接口

f.close()

因爲文件讀寫時都有可能產生IOError,一旦出錯,後面的f.close()就不會調用。因此,爲了保證不管是否出錯都能正確地關閉文件,咱們能夠使用try ... finally來實現:ip

try:
    f = open('file', 'r')
    print(f.read())
finally:
    if f:
        f.close()

可是每次都這麼寫實在太繁瑣,因此,Python引入了with語句來自動幫咱們調用close()方法:內存

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

python文件對象提供了三個「讀」方法: read()、readline() 和 readlines()。每種方法能夠接受一個變量以限制每次讀取的數據量。

  • read() 每次讀取整個文件,它一般用於將文件內容放到一個字符串變量中。若是文件大於可用內存,爲了保險起見,能夠反覆調用read(size)方法,每次最多讀取size個字節的內容。

  • readlines() 之間的差別是後者一次讀取整個文件,象 .read() 同樣。.readlines() 自動將文件內容分析成一個行的列表,該列表能夠由 Python 的 for ... in ..… 結構進行處理
  • readline() 每次只讀取一行,一般比readlines() 慢得多。僅當沒有足夠內存能夠一次讀取整個文件時,才應該使用 readline()

注意:這三種方法是把每行末尾的'\n'也讀進來了,它並不會默認的把'\n'去掉,須要咱們手動去掉。

with open('test1.txt', 'r') as f1:
    list1 = f1.readlines()
list1
['111\n', '222\n', '333\n', '444\n', '555\n', '666\n']

去掉'\n'

with open('test1.txt', 'r') as f1:
    list1 = f1.readlines()
for i in range(0, len(list1)):
    list1[i] = list1[i].rstrip('\n')
 list1
 ['111', '222', '333', '444', '555', '666']

對於read()readline()也是把'\n'讀入了,可是print的時候能夠正常顯示(由於print裏的'\n'被認爲是換行的意思)

readable(),writable() 判斷當前文件是否可讀寫

# f = open("a.txt")
#
# print(f.readable())  # 判斷當前文件是否可讀
# print(f.writable())  # 判斷當前文件是否可寫
#
# # del f  # 回收變量資源
# f.close()  # 回收操做系統的資源

with open()能夠同時打開多個文件

# with open('a.txt',mode='r')as rf,\
#         open('a.txt',mode='w')as wf:

寫文件

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

>>> f = open('test.txt', 'w') # 如果'wb'就表示寫二進制文件
>>> f.write('Hello, world!')
>>> f.close()

注意:'w'這個模式是醬紫:若是沒有這個文件,就建立一個;若是有,那麼就會先把原文件的內容清空再寫入新的東西。因此若不想清空原來的內容而是直接在後面追加新的內容,就用'a'這個模式。

咱們能夠反覆調用write()來寫入文件,可是務必要調用f.close()來關閉文件。當咱們寫文件時,操做系統每每不會馬上把數據寫入磁盤,而是放到內存緩存起來,空閒的時候再慢慢寫入。只有調用close()方法時,操做系統才保證把沒有寫入的數據所有寫入磁盤。忘記調用close()的後果是數據可能只寫了一部分到磁盤,剩下的丟失了。因此,仍是用with語句來得保險:

'r':只讀
'w':只寫(慎用)若是文件內存在數據,會將數據清空,從新寫入
'a':追加(若是文件不存在,則新建一個文件寫入數據)
'r+' == r+w(可讀可寫,文件若不存在就報錯(IOError))
'w+' == w+r(可讀可寫,文件若不存在就建立)
'a+' ==a+r(可追加可寫,文件若不存在就建立)
對應的,若是是二進制文件,就都加一個b就好啦:
'rb'  'wb'  'ab'  'rb+'  'wb+'  'ab+'

控制文件指針

文件光標移動

f.seek(offset,whence)

offset表明文件的指針的偏移量

whence表明參考物,有三個取值

0:指針在文件的開頭
1:指針在當前文件指針所在的位置
2:指針在文件的末尾

tell每次統計都是從文件頭到當前指針所在位置

可用於獲取文件實時動態

**truncate()** 方法用於截斷文件,若是指定了可選參數 size,則表示截斷文件爲 size 個字符。

若是沒有指定 size,則從當前位置起截斷;

截斷以後 size 後面的全部字符被刪除。

f.truncate(10)
## 截取10個字節

flush() 方法是用來刷新緩衝區的,即將緩衝區中的數據馬上寫入文件,同時清空緩衝區,不須要是被動的等待輸出緩衝區寫入。

通常狀況下,文件關閉後會自動刷新緩衝區,但有時你須要在關閉前刷新它,這時就能夠使用 flush() 方法。

f.flush();
# 刷新緩衝區
相關文章
相關標籤/搜索