??按文件中數(shù)據(jù)的組織形式可以把文件分為文本文件和二進(jìn)制文件兩大類。文本文件的每一個(gè)字節(jié)存放一個(gè)ASCII碼,代表一個(gè)字符。二進(jìn)制文件是把內(nèi)存中的數(shù)據(jù)按其在內(nèi)存中的存儲(chǔ)形式原樣輸出到磁盤上存放。文件操作在實(shí)際問題應(yīng)用中經(jīng)常碰到。
1文件基本操作
1.1打開文件
??無論是文本文件還是二進(jìn)制文件,其操作流程基本都是一致的,即首先打開文件并創(chuàng)建文件對(duì)象,然后通過該文件對(duì)象對(duì)文件內(nèi)容進(jìn)行讀取、寫入、刪除、修改等操作,最后關(guān)閉并保存文件內(nèi)容。Python內(nèi)置了文件對(duì)象,通過open()函數(shù)可以按指定模式打開指定文件并創(chuàng)建文件對(duì)象。
??文件對(duì)象名=open(文件名[, 打開方式[, 緩沖區(qū)] )
??其中,文件名指定了被打開的文件名稱,如果要打開的文件不在當(dāng)前目錄中,還需要指定完整路徑。注意,文件路徑中的“\”要寫成“\”,例如,要打開e:\mypython中的test.txt文件,文件名要寫成“e:\mython\test.txt”。打開方式(見表2.5)指定了打開文件后的處理方式,例如“只讀”、“讀寫”、“追加”等。緩沖區(qū)指定了讀寫文件的緩沖模式,數(shù)值0表示不緩沖,數(shù)值1表示緩沖,如大于1則表示緩沖區(qū)的大小,默認(rèn)值是緩沖模式。
??如果執(zhí)行正常,open()函數(shù)返回1個(gè)文件對(duì)象,通過該文件對(duì)象可以對(duì)文件進(jìn)行各種操作,如果指定文件不存在、訪問權(quán)限不夠、磁盤空間不夠或其他原因?qū)е聞?chuàng)建文件對(duì)象失敗則拋出異常。

1.2文件對(duì)象屬性
??文件一旦打開,通過文件對(duì)象的屬性可以得到有關(guān)該文件的各種信息,文件對(duì)象常用屬性如表2.6所示。

1.3文件對(duì)象方法
??Python文件對(duì)象有很多方法,通過這些方法可以實(shí)現(xiàn)各種文件操作。文件對(duì)象常用方法如表2.7所示。

1.4關(guān)閉文件
??文件使用完畢后,應(yīng)當(dāng)關(guān)閉,這意味著釋放文件對(duì)象以供別的程序使用,同時(shí)也可以避免文件中數(shù)據(jù)的丟失。用文件對(duì)象的close()方法關(guān)閉文件,其調(diào)用格式為:
??文件對(duì)象名.close()
??例2.24 文件對(duì)象屬性操作示例。
??程序文件Pex2_24.py
f=open("Pdata2_12.txt","w")
print("Name of the file:",f.name)
print("Closed or not:",f.closed)
print("Opening mode:",f.mode)
f.close()
程序運(yùn)行結(jié)果如下:
Name of the file: Pdata2_1.txt
Closed or not: False
Opening mode: w
2文本文件的讀寫操作
??在本小節(jié),主要通過幾個(gè)示例來演示文本文件的讀寫操作。
??用記事本建立文本文件Pdata2_25.txt,其內(nèi)容如下:
Python is very useful.
Programming in Python is very easy.
??例2.25 統(tǒng)計(jì)文本文件Pdata2_13.txt中元音字母出現(xiàn)的次數(shù)。
??程序文件Pex2_15.py
f=open("Pdata2_13.txt","r")
s=f.read()
print(s) #顯示文件內(nèi)容
n=0
for c in s:
if c in "aeiouAEIOU": n+=1
print("元音的個(gè)數(shù)為:",n)
運(yùn)行結(jié)果:
Python is very useful.
Programming in Python is very easy.
元音的個(gè)數(shù)為: 15
??例2.26 向文本文件寫入數(shù)據(jù)示例。
??程序文件Pex2_26.py
f1=open("Pdata2_26.txt","w")
str1=['Hello',' ','World!']; str2=['Hello','World!']
f1.writelines(str1); f1.write('\n')
f1.writelines(str2); f1.close()
f2=open('Pdata2_26.txt')
a=f2.read(); print(a)
運(yùn)行結(jié)果:
Hello World!
HelloWorld!
??例2.27(續(xù)例2.21) 分別讀取文本文件Pdata2_21.txt中的前6行前8列數(shù)據(jù)、第9列的數(shù)值數(shù)據(jù)、最后一行數(shù)據(jù)。
??程序文件Pex2_27.py
import numpy as np
a = []; b = []; c = []
with open('Pdata2_21.txt') as file:
for (i, line) in enumerate(file):
elements = line.strip().split()
if i < 6:
a.append(list(map(float, elements[:8])))
b.append(float(elements[-1].rstrip('kg')))
else:
c = [float(x) for x in elements]
a = np.array(a); b = np.array(b); c = np.array(c)
print(a,'\n',b,'\n',c)
??注2.3 用with語(yǔ)句打開數(shù)據(jù)文件并把它綁定到對(duì)象file,不必操心在操作完資源后去關(guān)閉數(shù)據(jù)文件。
3文件管理方法
??Python的os模塊提供了類似于操作系統(tǒng)級(jí)的文件管理功能,如顯示當(dāng)前目錄下的文件和目錄列表、文件重命名、文件刪除、目錄管理等。要使用這個(gè)模塊,需要先導(dǎo)入它,然后調(diào)用相關(guān)的方法。
3.1文件和目錄列表
??listdir()方法返回指定目錄下的文件和目錄列表,它的一般格式為:
os.listdir(“目錄名”)
??例2.28 顯示指定目錄內(nèi)容示例。
??程序文件Pex2_28.py
import os
a=os.listdir("c:\\")
print(a) #顯示C根目錄下的文件和目錄列表
print("-------------------------------------")
b=os.listdir(".")
print(b) #顯示當(dāng)前工作目錄下的文件和目錄列表
3.2文件重命名
??rename()方法實(shí)現(xiàn)文件重命名,它的一般格式為:
os.rename("當(dāng)前文件名","新文件名")
??例如,將文件test1.txt重命名為test1.txt,命令如下:
import os
os.rename("test1.txt","test2.txt")
3.3Python中的目錄操作
??所有的文件都包含在不同的目錄中,os模塊有以下幾種方法,可以幫助創(chuàng)建、刪除和更改目錄。
??(1)mkdir()方法
??mkdir()方法在當(dāng)前目錄下創(chuàng)建目錄,一般格式為:
os.mkdir("新目錄名")
??例如,在當(dāng)前目錄下創(chuàng)建test目錄,命令如下:
os.mkdir("test")
??(2)chdir()方法
??可以使用chdir()方法來改變當(dāng)前目錄,一般格式為:
os.chdir("要成為當(dāng)前目錄的目錄名")
??例如,將“d:\test”目錄設(shè)定為當(dāng)前目錄,命令如下
os.chdir("D:\\test")
??(3)getcwd()方法
??getcwd()方法顯示當(dāng)前的工作目錄,一般格式為:
os.getcwd()
??(4)rmdir()方法
??rmdir()方法刪除空目錄,一般格式為:
os.rmdir("待刪除目錄名")
??在用rmdir()方法刪除一個(gè)目錄時(shí),先要?jiǎng)h除目錄中的所有內(nèi)容,然后才能刪除目錄。