前言
在磁盤上讀寫文件的功能是操作系統(tǒng)提供的,現(xiàn)在操作系統(tǒng)不允許普通程序直接操作磁盤,所以讀寫文件是請(qǐng)求操作系統(tǒng)打開一個(gè)文件對(duì)象(文件描述符),然后通過操作系統(tǒng)提供的接口對(duì)這個(gè)對(duì)象讀寫數(shù)據(jù),所以使用完文件必須關(guān)閉,因?yàn)槲募?duì)象會(huì)占用操作系統(tǒng)的資源,并且操作系統(tǒng)同一時(shí)間打開的文件數(shù)是有限的。
文件的讀寫
讀文件open()函數(shù)
open(name[, mode[, buffering]]) -> file object
若該路徑找不到相應(yīng)的文件夾,則報(bào)錯(cuò):IOError
f = open(“F:/python/tian.txt”,”r”)
read() 函數(shù),可一次讀取文件的全部?jī)?nèi)容,以str的類型存在內(nèi)存中
print type(f) # 文件 file
print type(f.read()) # 字符串 str
在IDE中 read() 函數(shù)讀取的中文是亂碼,所以需要解碼。
print f.read().decode(“gbk”,”ignore”).encode(“utf-8”)
調(diào)用read()函數(shù)會(huì)一次性讀取文件的全部?jī)?nèi)容,如果文件有10G,內(nèi)存就爆了,所以提供:
一次讀取 size 字節(jié)的內(nèi)容
f.read(size)
一次讀取一行的內(nèi)容
f.readline()
一次讀取所有的內(nèi)容,但是按照行返回list
f.readlines()
如下所示:
for line in f.readlines():
print(line.strip()) # 把末尾的’\n’刪掉
文件對(duì)象會(huì)占用操作系統(tǒng)的資源,并且操作系統(tǒng)同一時(shí)間打開的文件數(shù)量是有限的所以文件的相關(guān)操作完成時(shí),需要close()
f.close()
但是,當(dāng)open()報(bào)錯(cuò)的時(shí)候,程序跳出,則不執(zhí)行close()函數(shù),
所以可以采用try…finally函數(shù)體,無論try函數(shù)體出現(xiàn)什么錯(cuò)誤都會(huì)執(zhí)行finally函數(shù)體
try:
d = open("F:/python/tian.txt","r")
print d.read().decode("gbk","ignore").encode("utf-8")
finally:
if d:
d.close()
python有with語句 自動(dòng)幫我們調(diào)用close()函數(shù)
則使用with語句寫文件是一個(gè)好函數(shù)
with open("F:/python/tian.txt","r") as h:
print h.read().decode("gbk","ignore").encode("utf-8")
python 提供一個(gè)codecs模塊幫我們?cè)谧x文件的時(shí)候自動(dòng)轉(zhuǎn)換編碼,讀出unicode編碼
import codecs
with codecs.open("F:/python/test_zhongwen.txt","r",'gbk') as f:
print f.read().encode("utf-8")
寫文件,文件不存在則新建,若存在則直接寫.
但是寫文件時(shí),系統(tǒng)不會(huì)及時(shí)的把數(shù)據(jù)寫入磁盤,而是放入內(nèi)存中,當(dāng)系統(tǒng)空閑的時(shí)候才往內(nèi)存中寫,只有close()的時(shí)候才會(huì)把所有的文件寫入磁盤上所以忘記close的時(shí)候,常常磁盤上數(shù)據(jù)可能寫入的不完整。
f = open("F:/python/test_21.txt",'w')
f.write("blwy,rzss\n")
f.write('hello,world!')
f.close()
# 或者使用with語法
with open("F:/python/test_21.txt",'w') as f:
f.write("xxxx")
文件和目錄操作
提供os模塊可以直接調(diào)用操作系統(tǒng)提供的接口函數(shù)。
import os
# 查看絕對(duì)路徑
os.path.abspath(".")
# 獲得當(dāng)前工作目錄
os.getcwd()
# 將兩個(gè)路徑合并
# 注意 linux下合并符為/ 而win下合并符為\
os.path.join("F:/python","write1_test.txt")
# 將兩個(gè)路徑拆分
os.path.split("F:/python/write1_test.txt")
# 返回文件名字
os.path.basename("F:/python/write1_test.txt")
# 返回文件路徑
os.path.dirname("F:/python/write1_test.txt")
# 直接得到文件的擴(kuò)展名
os.path.splitext("F:/python/write1_test.txt")
# 創(chuàng)建目錄
os.mkdir("F:/python/mkdir_test")
# 刪除目錄
os.rmdir("F:/python/mkdir_test")
# 創(chuàng)建文件
f = open("F:/python/mdir_test.txt","w")
f.close()
# 文件改名字 old/new 都必須寫完整路徑(可以理解為替換)
os.rename("F:/python/mdir_test.txt","F:/python/mdir.txt")
# 刪除文件
os.remove("F:/python/python_test_workplace/mdir.txt")
# 復(fù)制函數(shù)引用新的模塊 shutil
import shutil
shutil.copyfile("F:/python/python_test_workplace/1.txt","2.txt")
一生順利,一生被愛。