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