程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Python >> Python的文件open()方法使用詳解

Python的文件open()方法使用詳解

編輯:Python

  Python內置了一個open()方法,用於對本地文件進行讀寫操作。這個功能簡單、實用,屬於必須掌握的基礎知識。

  使用open方法操作文件可以分三步走,一是打開文件,二是操作文件,三是關閉文件。下面分別介紹:  

一、打開文件

  其基本語法:f = open('文件名','打開模式')

  打開模式:

    r   只讀    默認模式,如果文件不存在就報錯,存在就正常讀取。

    w  只寫    如果文件不存在,新建文件,然後寫入;如果存在,先清空文件內容,再寫入。

    a  追加    如果文件不存在,新建文件,然後寫入;如果存在,在文件的最後追加寫入。

    x  只寫    如果文件存在則報錯,如果不存在就新建文件,然後寫入內容,比w模式更安全。python3以上新增。

    +  讀寫模式  比如r+     w+     a+      (下文詳細說明)

    b  二進制模式 比如rb   wb  ab     這個和bytes類型、字符串類型有關系(下文詳細說明)

    還有r+b  w+b  a+b的組合模式,不在一一列舉

  特別強調:

   1. b模式:二進制模式,也就是01010101之類的比特流。需要特別注意,它在讀寫的時候是以字節類型(bytes)讀寫的,因此獲得的是一個字節對象而不是字符串。在這個讀寫過程中,需要自己指定字節類型的編碼格式。以write()方法為例進行說明,read()方法也是同樣的。

s = 'this is a test'
b = bytes(s,encoding='utf-8')

f = open('test.txt','w')
f.write(s)

##這樣沒問題,正常寫入了文件。

##-------------------------------------------------
s = 'this is a test'
b = bytes(s,encoding='utf-8')

f = open('test.txt','wb')    ##注意多了個b
f.write(s)

##報錯
TypeError: a bytes-like object is required, not 'str'
##意思是它需要一個bytes類型數據,你卻給了個字符串

##---------------------------------------------------
s = 'this is a test'
b = bytes(s,encoding='utf-8')

f = open('test.txt','wb')    ##注意多了個b
f.write(b)                        ##將變量b傳給它,b是個bytes類型

##成功執行!

  因此,在使用帶b的模式時一定要注意傳入的數據類型。沒有b以字符為單位進行讀寫,有b則以字節為單位讀寫。

  2. +模式:   對於w+,事實上這種模式,在讀寫之前都會清空你文件內容,請不要使用!

        對於a+模式,事實上這種模式,你永遠只能在文件的末尾寫入,有局限性,請不要使用!

        對於r+模式,相對來說最好的讀寫模式,配合seek()和tell()方法,可以實現大部分操作。

二、文件操作方法

  在Python3中,基本的文件操作方法有:

class TextIOWrapper(_TextIOBase):
    
    def close(self, *args, **kwargs):
        關閉文件
        pass

    def fileno(self, *args, **kwargs): 
        文件描述符  
        pass

    def flush(self, *args, **kwargs):
        刷新文件內部緩沖區
        pass

    def isatty(self, *args, **kwargs):
        判斷文件是否是同意tty設備
        pass

    def read(self, *args, **kwargs): 
        讀取指定字節數據
        pass
  
    def readable(self, *args, **kwargs): 
        是否可讀
        pass

    def readline(self, *args, **kwargs): 
        僅讀取一行數據
        pass

    def seek(self, *args, **kwargs): #
        指定文件中指針位置
        pass

    def seekable(self, *args, **kwargs): 
        指針是否可操作
        pass

    def tell(self, *args, **kwargs): 
        獲取指針位置
        pass

    def truncate(self, *args, **kwargs): 
        截斷數據,僅保留指定之前數據
        pass

    def writable(self, *args, **kwargs): 
        是否可寫
        pass

    def write(self, *args, **kwargs): 
        寫內容
        pass

    def __getstate__(self, *args, **kwargs): 
        pass

    def __init__(self, *args, **kwargs): 
        pass

    @staticmethod 
    def __new__(*args, **kwargs): # real signature unknown
        """ Create and return a new object.  See help(type) for accurate signature. """
        pass

    def __next__(self, *args, **kwargs): 
        """ Implement next(self). """
        pass

    def __repr__(self, *args, **kwargs):
        """ Return repr(self). """
        pass

    buffer = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default

    closed = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default

    encoding = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default

    errors = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default

    line_buffering = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default

    name = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default

    newlines = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default

    _CHUNK_SIZE = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default

    _finalizing = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default

  其中,真正重要的,用得著的是read、readline、readlines、write、tell、seek、flush、close這幾個方法。請注意,沒有直接修改文件內容的方法。下面介紹一下這幾個重點方法:

  1.read():可指定一次讀取的數量,比如f.read(10)。如果打開模式沒有b,則read的時候以字符為單位進行讀取,有b則以字節為單位讀取。

  2.write():如果打開模式沒有b,則接受普通的字符串為參數;如果有b則需要傳入bytes類型的對象。

  3.readline():讀入一行,如果打開模式沒有b,則返回一行字符串;如果有b,則返回bytes類型。可以指定數量參數。

  4. readlines():將所有文件按行讀入,如果打開模式沒有b,則返回由各行字符串為元素組成的列表;如果有b,則返回由各行的bytes類型組成的列表。可以指定數量參數。

  5.tell():在打開的文件中,維持著一個位置指針,默認剛開始處於文件的頂端,也就是0位置,在讀的過程中,讀走多少,指針就移動多少,並且它永遠是以字節為單位進行計數。因此在使用時一定要注意編碼的問題,否則容易造成讀寫的亂碼。tell方法可以獲取當前指針的位置,使用方法,f.tell()。

  6.seek():將指針指向指定的下標處,與tell配合使用,單位是字節。使用方法,f.seek(5)。

  7.flush():將剛寫入的內容刷新到本地文件。默認情況下,在文件關閉後,緩存內的數據才會寫入本地文件,這樣可能會造成數據訪問不一致。

 

三、關閉文件

  為了防止資源洩露,文件破壞,在每次對文件做完操作,我們都要關閉文件。它很簡單,文件句柄.close()就可以。

四、with—上下文管理器

  Python的with語法非常棒,它能幫你自動關閉打開的文件,不需要你手動調用close()方法。

  with的基本使用方式如下:

    with open('test.txt','w') as f:

      f.write('str')

  而且在2.7以後的版本中,它還支持同時打開多個文件。

    with open('log1') as obj1, open('log2') as obj2:

      pass   with不但能管理文件,還能管理別的對象。

五、文件的迭代

  當文件被打開後,可以對文件進行逐行迭代:

  for line in f:

    pass

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved