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


目錄結構:

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,獲取文件的名稱。

 

2.Python中的文件類型

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

 

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的取值。

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


下面是一個使用案例:

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后,就可以文件內容如下:

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

 

 

3.4 讀取文本文件

讀取文件的內容的方式是多種多樣的,如果需要讀取一個文件中的所有的內容,那么可以使用read方法。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM