【Python】解析Python中的文件操做

目錄結構:html

contents structure [-]

1.簡介

在Python中無需引入額外的模塊來進行文件操做,Python擁有內置的文件操做函數(除了內置文件操做函數,Python語言也提供了額外的文件操做模塊,它們具備更增強大的功能)。

os模塊提供了在操做系統上可移植的文件操做方法。若是隻是想要讀取和寫入數據,那麼能夠用內置的open()方法。若是想要操做路徑,可使用os.path模塊。若是想要在命令行上讀取全部的數據行,那麼可使用fileinput模塊。若是想要建立一個臨時文件或路徑,那麼可使用tempfile模塊。若是想要更高級別的文件和目錄操做,那麼可使用shutil模塊。

下面開始介紹內置的Open方法(在本文的後面還有關於os和fileinput模塊的講解):

首先須要用Python中的內置open函數得到一個文件對象(file object)。

內置open函數能夠直接打開一個文件(file),而後返回一個文件對象(file object),文件對象包含了的大量方法和屬性,能夠用這些方法和屬性操做被打開的文件。

文件對象的closed屬性,表示一個文件是否關閉(若是已關閉返回True,不然返回False)。mode,獲取文件的打開模式。name,獲取文件的名稱。python

 

2.Python中的文件類型

在Windows操做系統中,文件能夠是圖像、文本、可執行、音頻、視頻等等文件格式。可是在python中,文件被分爲兩類:一類是文本文件,另外一類是二進制文件。文本文件由一行行的字符構成,每一行文本的末尾都有一個EOL字符(End Of Line Character)。EOL標誌着當前行的結束和新的一行的開始。二進制文件不一樣與文本文件,二進制文件也只能由知道文件格式的應用程序處理。linux

 

3.內置函數的文件操做

3.1 open()函數

Python中的內置函數open會打開一個文件,而且返回一個文件對象。
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
file:打開文件的路徑,必需提供。
mode:打開模式,默認爲r(只讀訪問)
buffering:緩衝模式,值爲0表示沒有緩衝,1表示行緩衝,大於1就表示緩衝區域的大小,負數表示默認爲系統的緩衝區大小。設置了緩衝後,能夠用flush()方法刷新緩衝。
encoding:文件的操做的編碼名稱
errors:一個可選字符串,指定如何處理編碼和解碼的錯誤
newline:控制換行符模式的行爲
closefd:若是爲false,那麼應該傳入一個文件描述符(file descripter)而不該該傳入文件名稱。若是是True,那麼必須傳入文件名稱。不然會出現錯誤。
opener:一個可調用對象,

上面的參數中只有file參數是必需提供的,mode參數指定了文件的打開模式,接下來筆者會詳細介紹它的全部取值。編程

 

3.2 Mode

Mode表明文件的打開模式,在上面介紹的open方法就須要用到文件的打開模式(Mode),open的參數中mode是可選的,下面的表闡述了Mode的取值。windows

模式 描述
r 以只讀的方式打開文件。文件的指針將會放在文件的開頭。這是默認模式。
rb 以二進制格式打開一個文件只用於讀。文件指針將會放在文件的開頭。
r+ 打開文件用於讀寫。文件指針將會放在文件的開頭。
rb+ 以二進制格式打開一個文件用於讀寫。文件指針將會放在文件的開頭。
w 打開一個文件只用於寫入。若是該文件已存在則將其覆蓋。若是該文件不存在,建立新文件。
wb 以二進制格式打開一個文件只用於寫入。若是該文件已存在則將其覆蓋。若是該文件不存在,建立新文件。
w+ 打開一個文件用於讀寫。若是該文件已存在則將其覆蓋。若是該文件不存在,建立新文件。
wb+ 以二進制格式打開一個文件用於讀寫。若是該文件已存在則將其覆蓋。若是該文件不存在,建立新文件。
a 打開一個文件用於追加。若是該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會寫入到已有的內容以後。若是該文件不存在,建立新文件進行寫入。
ab 以二進制格式打開一個文件用於追加。若是該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會寫入到已有的內容以後。若是該文件不存在,建立新文件進行寫入。
a+ 打開一個文件用於讀寫。若是該文件已存在,文件指針將會放在文件的結尾。在文件打開時會使用追加模式。若是該文件不存在,建立新文件用於讀寫。
ab+ 以二進制格式打開一個文件用於追加。若是該文件已存在,文件指針將會放在文件的結尾。若是該文件不存在,建立新文件用於讀寫。


下面是一個使用案例:app

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


在上面介紹過,open函數會返回一個文件對象(File Object)。一旦咱們拿到這個文件對象,就能夠調用這個對象上的屬性和方法了。最經常使用的方法就是read和write了。編輯器

 

3.3 建立文本文件

爲了增長對文本文件的熟悉程度,接下來咱們將會建立本身的文本文件,而且在上面作一些練習。用一個文本編輯器,建立一個名爲testfile.txt的文件。而後在同一級目錄下,就可使用以下的代碼進行文件寫入操做了函數

file = open(「testfile.txt」,」w」)
file.write(「Hello World」)
file.write(「This is our new text file」)
file.write(「and this is another line.」)
file.write(「Why? Because we can.」)
file.close() 

當咱們打開testfile.txt後,就能夠文件內容以下:ui

$ cat testfile.txt
Hello World
This is our new text file
and this is another line.
Why? Because we can.

 

 

3.4 讀取文本文件

讀取文件的內容的方式是多種多樣的,若是須要讀取一個文件中的全部的內容,那麼可使用read方法。this

file = open(「testfile.txt」, 「r」)
print file.read()
file.close()

你會看見testfile.txt的全部文件內容都會被輸出。

咱們也能夠只讀取指定數量的字符,只須要將須要讀取的字符數量傳遞給read方法即可以了。

file = open(「testfile.txt」, 「r」)
print file.read(5)
file.close()

輸出:

Hello

 


若是想一行行的讀取文本文件的內容,那麼可使用readline方法。

file = open(「testfile.txt」, 「r」)
print file.readline()
file.close()

輸出:

Hello World 



若是想返回文件中的每行數據,那麼可使用readlines方法。

file = open(「testfile.txt」, 「r」)
print file.readlines()
file.close()

輸出:

[‘Hello World’, ‘This is our new text file’, ‘and this is another line.’, ‘Why? Because we can.’] 

 

3.5 循環文件對象

若是想要更有效率的循環文件中的每一行數據,那麼可使用循環語句,使用循環語句代碼不只簡單並且易讀。

file = open(「testfile.txt」, 「r」)
for line in file:
    print line
file.close()

輸出:

Hello World
This is our new text file
and this is another line.
Why? Because we can. 

 

3.6 關閉文件

當完成對文件的操做後,就可使用close()方法關閉文件。它將會完全關閉文件,中斷正在使用資源,而且將這些資源返還給系統。

在使用完文件以後,記得要調用close()方法。在調用close()後,任何對文件對象(file object)的操做都是非法的。

在上面的全部案例中,咱們在每次使用完文件對象後都調用過close()方法,這是很是好的習慣。

 

3.7 With語句

能夠將with語句應用到文件對象(file object)上,使用with語句語法更清晰。使用with語句的優勢在於任何打開的文件都會自動關閉,所以使用with沒必要擔憂資源的釋放問題。

使用with語句打開文件的格式:
with open("filename") as file:

下面是一個完整的案例:

with open(「testfile.txt」) as file:  
    data = file.read()
    //do something with data 

在上面的案例代碼中,咱們並無使用close()關閉文件對象。這是由於with語句會自動幫咱們關閉,編程人員即可以更專一業務邏輯代碼。

下面是循環文件內容的案例:

with open(「testfile.txt」) as f:
    for line in f:
        print line, 

 

4.os模塊

os模塊提供了許多與操做系統相交互的函數,OS是Python的標準組件模塊。該模塊提供了可移植性的文件操做方法。os和os.path模塊包含了許多可以與文件操做系統相交互的方法。

 

os.name

導入該模塊的操做系統的名稱,windows是nt,linux是posix

import os
print(os.name) #windows是nt,linux是posix

輸出:

posix

 

 

os.getcwd()

os.getcwd()函數返回當前的工做目錄(Current Working Directory,CWD)

import os
print(os.getcwd())
# 打印當前的絕對路徑
# os.path.abspath('.')  
 
# 打印當前路徑下的文件和文件夾
# os.listdir('.') 

輸出:

/home/user/test

 

 

os.popen()

該方法會打開一個鏈接到命令行的管道,該管道的讀寫性依賴於打開模式。
os.popen(command[, mode[, bufsize]])
mode(打開模式)和bufsize不是必需要提供的。若是爲打開模式爲提供,那麼默認爲"r",也就是隻讀模式(read only)。
案例:

import os
fd = "a.txt"
 
# popen() 和 open() 類似
file = open(fd, 'w')
file.write("Hello")
file.close()
file = open(fd, 'r')
text = file.read()
print(text)
 
# popen() 提供了直接訪問文件的管道
file = os.popen(fd, 'w')
file.write("Hello")
# 其餘的一些操做
# 關閉文件
file.close()

 

os.close()

若是一個文件是使用open()打開的,那麼只能使用close()關閉。可是若是一個文件是經過os.popen()的,那麼可使用close()或os.close()方法。若是咱們試圖用os.close()去關閉一個open()打開的文件,那麼會拋出錯誤:

import os
fd = "a.txt"
file = open(fd, 'r') #使用open打開文件
text = file.read()
print(text)
os.close(file) #使用os.close()關閉文件

輸出:

Traceback (most recent call last):
  File "/home/user/test/a.py", line 6, in
    os.close(file)
TypeError: an integer is required (got type _io.TextIOWrapper)

 

 

os.rename()

可使用os.rename()重命名文件的名稱,被命名的文件必需存在並且用戶應該具備改變文件名稱的權限。

import os
fd = "a.txt"
os.rename(fd,'New.txt')
os.rename(fd,'New.txt')

輸出:

Traceback (most recent call last):
  File "/home/user/test/a.py", line 3, in
    os.rename(fd,'New.txt')
FileNotFoundError: [WinError 2] The system cannot find the
file specified: 'a.txt' -> 'New.txt'

 

 

5.fileInput模塊

fileinput模塊能夠對一個或多個文件中的內容進行迭代、遍歷等操做。該模塊的input()函數有點相似文件readlines()方法,區別在於前者是一個迭代對象,須要用for循環迭代,後者是一次性讀取全部行。
用fileinput對文件進行循環遍歷,格式化輸出,查找、替換等操做,很是方便。

典型用法:

import fileinput
for line in fileinput.input():
    process(line)

 

基本格式:

fileinput.input([files[, inplace[, backup[, bufsize[, mode[, openhook]]]]]])

參數說明:

files:                  #文件的路徑列表,默認是stdin方式,多文件['1.txt','2.txt',...]
inplace:                #是否將標準輸出的結果寫回文件,默認爲0不返回,設置爲1時返回
backup:                 #備份文件的擴展名,只指定擴展名,如.bak。若是該文件的備份文件已存在,則會自動覆蓋。
bufsize:                #緩衝區大小,默認爲0,若是文件很大,能夠修改此參數,通常默認便可
mode:                   #讀寫模式,默認爲只讀
openhook:               #該鉤子用於控制打開的全部文件,好比說編碼方式等;

經常使用函數

函數 描述
fileinput.input() 返回可以用於for循環遍歷的對象
fileinput.filename() 返回當前文件的名稱
fileinput.lineno() 返回當前已經讀取的行的數量(或者序號)
fileinput.filelineno() 返回當前讀取的行的行號
fileinput.isfirstline() 檢查當前行是不是文件的第一行
fileinput.isstdin() 判斷最後一行是否從stdin中讀取
fileinput.close() 關閉隊列



#test.py
#---樣本文件---
c:Python27>type 1.txt
first
second

c:Python27>type 2.txt
third
fourth
#---樣本文件---
import fileinput

def process(line):
    return line.rstrip() + ' line'

for line in fileinput.input(['1.txt','2.txt'],inplace=1):
    print process(line)

#---結果輸出---
c:Python27>type 1.txt
first line
second line

c:Python27>type 2.txt
third line
fourth line
#---結果輸出---

 

參考文章:

https://www.pythonforbeginners.com/files/reading-and-writing-files-in-python
https://www.geeksforgeeks.org/os-module-python-examples/
https://www.2cto.com/kf/201412/361320.html

相關文章
相關標籤/搜索