python檔案操作

來源:互聯網
上載者:User

標籤:opera   rect   判斷   作業系統   encoding   mongod   建立   檔案   清除   

首先,我們需要知道一個概念:應用程式是不能直接對電腦硬體進行操作的

在作業系統中,作業系統對外提供了檔案系統,硬碟上的檔案都由檔案系統進行資源管理,

讀寫硬碟是一種硬體操作,所以我們要想進行檔案操作,就必須通過檔案系統這個介面來進行檔案操作

因此

我們要想進行檔案讀寫等操作,就必須先向作業系統發起系統調用,由作業系統的核心來進行檔案的讀寫操作,作業系統把執行結果返回給應用程式,最後則應用程式把執行結果呈現在使用者面前

python提供了一個進行檔案讀寫操作的系統調用方法:open()

open()是python內建函數,我們可以通過調用open()函數來向作業系統發起系統調用,進行檔案的讀寫操作
open()函數的用法

建立一個open_func.py檔案,再建立一個file1.txt檔案

file1.txt檔案內容為:

離離原上草,一歲一枯榮。野火燒不盡,春風吹又生。

先在open_func.py檔案中開啟file1.txt

>>> f=open("file1.txt")     # 沒有指定file1.txt檔案的絕對路徑,所以這裡用的是相對路徑                            # 第二個參數為讀取檔案的模式,不寫預設為"r",即讀模數式                            # 把開啟檔案的控制代碼賦值給一個變數f>>> print(f)<_io.TextIOWrapper name=‘file1.txt‘ mode=‘r‘ encoding=‘UTF-8‘>>>> f.read()                # f.read()會讀取指定檔案的指定長度字元的內容,如果沒有指定讀取長度,則讀取所有內容‘離離原上草,\n一歲一枯榮。\n野火燒不盡,\n春風吹又生。\n‘>>> f.read()                # 再次調用f.read()方法,其列印結果為空白,也說明上一次f.read()讀取指定檔案的所有內容‘‘>>> f.close()               # 關閉檔案

需要注意的點:

  • 開啟一個檔案操作完成後一定要關閉這個檔案,否則被開啟的檔案會一直存在於系統記憶體中,佔用系統資源
指定讀取長度的方法:f.read()
[[email protected] ~]# cat file2.txt       # 在系統命令提示字元下查看檔案file2.txt的內容pythonlinuxmysql>>> f=open("file2.txt")             # 以預設開啟一個不存在的檔案file2.txt,會拋出異常Traceback (most recent call last):  File "<stdin>", line 1, in <module>FileNotFoundError: [Errno 2] No such file or directory: ‘file2.txt‘

在python解譯器中進行操作

>>> f=open("file2.txt","r")         # 以讀模式開啟檔案>>> f.read(2)                       # 讀取兩個字元‘py‘>>> f.read(5)                       # 再向後讀取5個字元‘thon\n‘>>> f.read(5)                       # 再次繼續讀取5個字元‘linux‘>>> f.close()                       # 關閉檔案
一次讀取一行內容的方法:f.readline()
>>> f=open("file1.txt")     # 再次開啟file1.txt檔案>>> f.readline()            # f.readline()方法執行一次讀取檔案的一行內容‘離離原上草,\n‘>>> f.readline()            # 再次執行f.readline()方法,會接著游標在檔案中的內容再次讀取檔案的一行內容‘一歲一枯榮。\n‘>>> print(f.readline(),end="")      # 這次使用print()方法列印f.readline()方法讀取的一行內容,並指定檔案結尾野火燒不盡,>>> print(f.readline(),end="")春風吹又生。>>> f.readline()            # 檔案已經被讀取完了,再次調用f.readline()方法讀取檔案內容會返回空‘‘>>> f.close()               # 因為檔案已經被讀取完,游標已經被移動到檔案的末尾了,所以關閉檔案
讀取整個檔案內容產生列表的方法:f.readlines()
>>> f=open("file1.txt")     # 開啟檔案>>> f.readlines()           # f.readlines()會一次性讀取檔案的所有內容,並把每一行做為一個元素放入一個列表中[‘離離原上草,\n‘, ‘一歲一枯榮。\n‘, ‘野火燒不盡,\n‘, ‘春風吹又生。\n‘]>>> f.write("aaa")          # 向檔案中寫入一行"aaa",因為是以讀的方式開啟檔案,所以調用f.write()方法向檔案中寫入一行是會提示錯誤:無法寫入Traceback (most recent call last):  File "<stdin>", line 1, in <module>io.UnsupportedOperation: not writable>>> f.close()
現在再以"w"的方式開啟檔案
>>> f=open("file1.txt","w")     # 以"w"的方式開啟檔案>>> f.close()                   # 關閉檔案重新開啟一個命令視窗,查看file1.txt檔案的內容

在前面的例子裡,file1.txt檔案裡是有內容的,但是在這裡查看檔案內容卻是空了

[[email protected] ~]# cat file1.txt       # 可以看到檔案中沒有任何內容[[email protected] ~]# ll file1.txt        # 檔案大小變為0了-rw-r--r-- 1 root root 0 Jan 27 22:46 file1.txt

在上面的例子裡,我們可以看到,以"w"的方式開啟檔案時,會清除指定檔案原有的內容

實際上,在python中,以"r"方式開啟檔案時,如果被開啟的檔案不存在時,是會拋出異常的而以"w"模式開啟檔案時,如果檔案不存在則建立這個檔案,如果檔案已經存在,則清空這個檔案的原有內容

再看下一個例子

>>> f=open("file1.txt","w")         # 以"w"模式開啟file1.txt>>> f.write("hello world")          # 向檔案中寫入一行內容11>>> f.write("hello python")         # 向檔案中再次寫入一行內容12>>> f.close()                       # 關閉檔案

在系統命令列中查看file1.txt檔案的內容及大小

[[email protected] ~]# cat file1.txt       # 查看檔案內容hello worldhello python[[email protected] ~]# ll file1.txt-rw-r--r-- 1 root root 23 Jan 27 22:59 file1.txt

查看檔案內容可以看到檔案中沒有分行符號,所以在向檔案中寫入內容時,需要我們自己在末尾處添加分行符號

>>> f=open("file1.txt","w")         # 以"w"模式開啟file1.txt>>> f.write("hello python\n")       # 向檔案中添加一行,在行尾添加分行符號13      >>> f.write("hello world\n")        # 再次向檔案中添加一行,在行尾也添加換行銜12>>> f.close()                       # 關閉檔案

再次在系統命令提示字元中查看檔案內容及大小

[[email protected] ~]# cat file1.txt       # 查看檔案內容,可以看到現在已經可以正常顯示了hello python    hello world[[email protected] ~]# ll file1.txt        # 查看檔案大小-rw-r--r-- 1 root root 25 Jan 27 23:03 file1.txt

在對檔案進行讀操作時,f.readlines會一次性讀取檔案的所有內容,並把每一行做為一個元素添加到列表中
在對檔案進行寫操作時,也有一個f.writelines方法.

把一個以字串為元素的列表寫入到檔案中的方法:f.writelines()

f.writelines()方法可以把一個列表的元素做為行寫入到檔案中

需要注意的是:列表中的元素必須是字串類型

>>> f=open("file1.txt","w")>>> f.writelines(["python\n","linux\n","mysql\n"])      # 調用f.writelines()方法把一個列表寫入到一個檔案中>>> f.close()

在系統命令提示字元視窗中查看檔案內容及大小

[[email protected] ~]# cat file1.txt       # 查看檔案內容pythonlinuxmysql[[email protected] ~]# ll file1.txt-rw-r--r-- 1 root root 19 Jan 27 23:09 file1.txt

可以看到字串元素的列表已經被寫入到檔案中去了。

以"a"模式開啟檔案並進行操作

以"a"模式開啟檔案時,如果指定檔案不存在,則建立指定檔案
如果指定檔案已經存在,則把游標移動到檔案末尾,在檔案最後一行進行新增內容操作

>>> f=open("file1.txt","a")     # 以"a"模式開啟檔案>>> f.write("nginx\n")          # 向檔案末尾追加一行內容6>>> f.write("javascript\n")     # 向檔案末尾再次追加一行內容11>>> f.close()                   # 關閉檔案

在系統命令提示字元視窗中查看檔案內容及大小

[[email protected] ~]# cat file1.txt   # 可以看到檔案file1.txt的末尾已經添加了兩行內容pythonlinuxmysqlnginxjavascript[[email protected] ~]# ll file1.txt    # 檔案大小發生改變-rw-r--r-- 1 root root 36 Jan 27 23:16 file1.txt

注意點:

在向檔案中新增內容時,實際上是在記憶體中向檔案新增內容的,只有等到檔案被關閉的時候,解譯器才會把記憶體中被修改的檔案內容同步到檔案中,在這個期間是有風險的,比如在檔案未被儲存到硬碟上之前,主機突然斷電,那麼這個檔案的內容就有可以被損壞

這時可以使用f.flush()方法把記憶體中被修改的檔案內容強行儲存到硬碟中

手動把記憶體中的檔案儲存到硬碟上的方法:f.flush()
>>> f=open("file1.txt","a")         # 以追加模式開啟檔案>>> f.write("mongodb\n")            # 向檔案中添加一行內容8>>> f.write("openstack\n")          # 再次向檔案中添加一行內容10>>> f.flush()                       # 調用f.flush()方法,把記憶體中的檔案內容儲存到硬碟中

在系統命令提示字元視窗中查看檔案內容及大小

[[email protected] ~]# cat file1.txt       # 在前面,並沒有關閉檔案,在這裡還是可以看到添加後的檔案內容pythonlinuxmysqlnginxjavascriptmongodbopenstack[[email protected] ~]# ll file1.txt        # 檔案大小發生改變-rw-r--r-- 1 root root 54 Jan 28 10:57 file1.txt
f.closed查看檔案是否關閉,返回一個布爾值

這個例子接著上面的例子進行操作

>>> f.closed        # 在上面的例子裡,調用f.flush()方法把記憶體中的檔案內容儲存到硬碟上,並沒有關閉檔案,查看檔案是否關閉,返回False,說明檔案沒有關閉False>>> f.close()       # 關閉檔案>>> f.closed        # 再次查看檔案是否關閉,返回True說明檔案已經關閉了True
把游標移動到檔案指定位置的方法:f.seek(offset[,whence])

參數說明:

第一個參數為移動的位元組數,第二個參數表示從哪個位置開始移動,0表示以檔案開始為參照點1表示以當前位置為參數點2表示以檔案末尾位置為參照點

例子:

>>> f=open("file1.txt","rb")        # 在這裡必須以"b"模式開啟檔案,否則會拋出異常>>> f.seek(5)                       # 當前游標在檔案首部,把游標從檔案首部向後移動5個位元組5>>> f.seek(5,1)                     # 再以游標當前所有位置為參照,向後移動五個位元組10>>> f.tell()                        # 查看當前游標所在位置10>>> f.seek(3,1)                     # 以游標當前所在位置為參照,向後移動3個位元組13>>> f.tell()                        # 查看當前游標所有位置13>>> f.seek(-2,2)                    # 把游標移動到檔案末尾,然後再向前移動2個位元組52>>> f.read()                        # 讀取游標所在處到檔案末尾的所有內容b‘k\n‘>>> f.tell()                        # 查看游標所在位置54>>> f.close()
查看當前游標所在位置的方法:f.tell()
f.tell()方法的位置為位元組,傳回值為數字

例子:

>>> f=open("file1.txt","r")>>> f.read()‘python\nlinux\nmysql\nnginx\njavascript\nmongodb\nopenstack\n‘>>> f.seek(10)10>>> f.tell()10>>> f.read()‘ux\nmysql\nnginx\njavascript\nmongodb\nopenstack\n‘>>> f.tell()54
以游標所在位置為參照,截取指定長度的內容,其餘內容被刪除:f.truncate()

例子:

>>> f=open("file2.txt","w")         # 以寫入模式開啟檔案>>> f.write("1111111\n")            # 向檔案中寫入一行內容8>>> f.write("2222222\n")            # 向檔案中寫入第二行內容8>>> f.write("3333333\n")            # 向檔案中寫入第三行內容8>>> f.truncate(5)                   # 從檔案開始位置向後截取5個位元組的長度的內容5>>> f.close()

在系統命令提示字元下查看檔案內容

[[email protected] ~]# cat file2.txt11111[[email protected] ~]#
其餘的用法
f.name              # 擷取被開啟檔案的檔案名稱f.encoding          # 擷取檔案的被開啟的編碼方式f.readable()        # 判斷檔案當前是否可讀f.writable()        # 判斷檔案當前是否可寫

例子:

>>> f=open("file1.txt","r")         # 以讀模式開啟檔案file1.txt>>> f.name                          # 查看檔案名稱‘file1.txt‘     >>> f.encoding                      # 查看檔案以哪種編碼方式被開啟‘UTF-8‘>>> f.readable()                    # 以讀模式開啟此檔案,所以判斷檔案是否可讀,傳回值為TrueTrue>>> f.writable()                    # 以讀模式開啟此檔案,所以判斷檔案是否可寫,傳回值為FalseFalse   >>> f.close()                       # 關閉檔案>>> f=open("file2.txt","w")         # 以寫入模式開啟檔案file2.txt>>> f.name‘file2.txt‘>>> f.encoding‘UTF-8‘>>> f.readable()                    # 以寫入模式開啟檔案,所以在這裡判斷檔案是否可讀時,返回FalseFalse>>> f.writable()                    # 以寫入模式開啟檔案,判斷檔案可寫傳回值為TrueTrue>>> f.close()

在python中除了上面說的三種開啟檔案的辦法外,還有另外一種開啟檔案的方法,那就是以二進位模式開啟檔案,即"rb","wb","ab"

現有另一個檔案file2.txt,內容為

離離原上草,一歲一枯榮。野火燒不盡,春風吹又生。

"rb"模式開啟檔案file2.txt,查看讀取到的內容

>>> f=open("file2.txt","rb")    # 以讀模式開啟檔案file2.txt>>> f.read()                    # 查看檔案內容時,可以看到是bytes格式的b‘\xe7\xa6\xbb\xe7\xa6\xbb\xe5\x8e\x9f\xe4\xb8\x8a\xe8\x8d\x89\xef\xbc\x8c\n\xe4\xb8\x80\xe5\xb2\x81\xe4\xb8\x80\xe6\x9e\xaf\xe8\x8d\xa3\xe3\x80\x82\n\xe9\x87\x8e\xe7\x81\xab\xe7\x83\xa7\xe4\xb8\x8d\xe5\xb0\xbd\xef\xbc\x8c\n\xe6\x98\xa5\xe9\xa3\x8e\xe5\x90\xb9\xe5\x8f\x88\xe7\x94\x9f\xe3\x80\x82\n‘>>> f=open("file2.txt","rb")>>> f.read().decode("utf8")     # 因為寫入時是以"utf8"編碼格式寫入的,所以在這裡要解碼成"utf8"格式的‘離離原上草,\n一歲一枯榮。\n野火燒不盡,\n春風吹又生。\n‘>>> f=open("file3.txt","wb")    # 以寫入模式開啟檔案file3.txt>>> f.write("python")           # 此時直接向f對象中寫入內容會拋出異常:寫入的內容需要是bytes對象,不能是字串格式的Traceback (most recent call last):  File "<stdin>", line 1, in <module>TypeError: a bytes-like object is required, not ‘str‘>>> f.write("python\n".encode("utf8"))      # 編碼成‘utf8‘格式,再寫入7>>> f.write("你好呀\n".encode("utf8"))10>>> f.close()

在系統命令提示字元下查看檔案大小及內容

[[email protected] ~]# cat file3.txtpython你好呀[[email protected] ~]# ll file3.txt-rw-r--r-- 1 root root 17 Jan 28 16:41 file3.txt

以"b"模式開啟檔案的好處:

1.讀取檔案的時候就是二進位格式的,不容易產生亂碼2.處理非文本類型的檔案時,寫入檔案的時候就需要以二制格式寫入,否則會拋出異常

例子:

用python的二進位方法把一個張圖片aa.jpg複製一份bb.jpgread_file=open(‘aa.jpg‘,‘rb‘)write_file=open("bb.jpg","wb")write_file.write(read_file.read())
[[email protected] ~]# ll *.jpg-rw-r--r-- 1 root root 95406 Jan 19 08:38 aa.jpg-rw-r--r-- 1 root root 95406 Jan 28 17:15 bb.jpg

總結:

開啟檔案時,需要指定檔案路徑和開啟檔案。開啟檔案後,即可擷取指定檔案的檔案控制代碼,然後通過操作檔案控制代碼來操作指定檔案        開啟檔案的模式有:    r       唯讀模式,開啟檔案預設模式,檔案必須存在,不存在則拋出異常    w       唯寫模式,檔案不存在則建立,存在則清空原有內容    a       追加模式,可以讀取檔案,檔案不存在則建立,存在則向檔案追加內容“+”表示可以同時讀寫某個檔案r+      讀寫(可讀可寫)w+      寫讀(可讀可寫)a+      寫讀(可讀可寫)"b"表示以位元組的方式操作rbwbab以b方式開啟檔案時,讀取到的內容是位元組類型,寫入時也需要提供位元組類型,不能指定編碼

小demo:

用python方法,替換檔案中的內容

查看初始檔案內容

[[email protected] ~]# cat test.txt aaaapythonaaaapythonaabbbblinuxbbblinuxbbbcccmysqlcccmysqlcccdddnginxdddnginxddd

現在想打test.txt檔案中所有的nginx換成httpd

指令碼如下:

import osread_f = open("test.txt", "r")write_f = open(".text.txt.swap", "w")for line in read_f:    if ‘nginx‘ in line:        line = line.replace("nginx", "httpd")    write_f.write(line)read_f.close()write_f.close()os.remove("test.txt")os.rename(".text.txt.swap", "test.txt")

運行這個python指令碼,然後查看test.txt的內容

[[email protected] ~]# cat test.txt aaaapythonaaaapythonaabbbblinuxbbblinuxbbbcccmysqlcccmysqlcccdddhttpddddhttpdddd

會發現檔案test.txt的內容已經被修改了

with上下文管理

使用open開啟檔案時,很容易會忘記關閉被開啟的檔案,這要一來被開啟的檔案一直運行在記憶體中,無形中造成了系統資源的浪費

這時可以使用with上下文管理來進行檔案操作,以解決因為忘記關閉檔案而造成的系統資源的浪費

使用with重構上面的內容替換的例子

import oswith open("a.txt","r") as read_f,open(".a.txt.swap","w") as write_f:    for line in read_f:        if "nginx" in line:            line=line.replace("nginx","httpd")        write_f.write(line)os.remove("a.txt")os.rename(".a.txt.swap","a.txt")

也可以完成同樣的功能,而且不用手動關閉被開啟的檔案

python檔案操作

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.