文件處理
打開文件
先假設我們在文件中出來現在已經有的.py文件還有一個叫text.txt的文件。
open
語法:open(file, mode=‘r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
open中參數眾多,但是我們常用的參數也就只有file,mode和encoding,接下來我們就來介紹一下這幾個參數的作用
file
文件名或路徑,這是open的必填參數,如果調用open最少你要說清你要打開那個文件。
路徑小知識:在Windows系統中路徑的分割使用的是\但是\在Python中是轉義字符,所以我們可以使用\來講\轉義成普通\,或使用f’'格式化字符串,或使用/來分割路徑,因為咋Linux系統中路徑的分割就是使用/進行的。
open(text.txt)
mode
文件打開模式,先來介紹參數,參數具體用法會在操作文檔的時候具體介紹
模式 | 功能 |
---|---|
r | 只讀模式(如果不填寫,則默認就是此模式) |
w | 覆蓋寫入模式(如果存在和寫入文件同名文件則覆蓋,不存在則新建) |
x | 新建文件寫入模式(如果存在和寫入文件同名文件則報錯,不存在則新建) |
a | 追加寫入模式(如果存在和寫入文件同名文件則在文件內容后追加,不存在則新建) |
b | 二進制讀取模式,此模式可以讀取除純文本之外的其他文件 |
t | 文本模式(默認打開模式) |
+ | 擴展模式,可以擴展上述的模式,但必須要配合使用,比如:r+就擴展了只讀模式,讓這個模式既可讀又可寫 |
encoding
文件的編碼格式,如果不填寫就只能讀取ASCII格式的文件,讀取中文的文件就會報錯,如果想要讀取中文,一般常用UTF-8。
操作文件
讀取文檔
逐個讀取read
語法:文件對象.read(size = -1)
-
read()默認值是-1,會自動讀取到最后一個值
-
可以給read指定一個值,read每次讀取都會從上次讀取結束的位置開始。換行符也算一個字符。
-
如果read指定的讀取數量大於實際數量,這會讀取所有文件。如果沒有內容,會返回一個‘’空串
逐行讀取
語法:文件對象.readline()
每次讀取一行內容。
語法:文件對象.readlines()
一行一行讀取,並且會把每行內容自動封裝到列表中。
文件讀取位置
- tell()可以用來返回當前讀取到的位置
- seek(參數1,參數2)可以修改當前讀取的位置
- 參數1用於指定讀取位置。
- 第二個參數為從哪開始指定位置
- 第二個參數接收:0從頭開始計數(默認),1從當前位置開始計數,2從最后位置開始計數。
- 第二個參數只能在b模式下改變。在b模式下seek參數一代表的為字節,在utf-8中一個中文字符等於三個字節
寫入文檔
write
語法:文件對象.write(寫入內容)
當文檔處於w、x、a等寫入模式的情況下才能使用write,否則會報錯
write寫入內容時會將寫入的字數作為返回值返回
data = open('text.txt', 'w', encoding='utf-8')
name = '我是尋覓'
data1 = data.write(name)
print(data1) # 4
關閉文件
close
語法:文件對象.close
將使用完的文件及時關閉,能有利於提升程序性能。
with… as…
使用這個函數打開文件使用完后會自動關閉,讓代碼變得更簡潔
語法:with open() as 變量:
with open('text.txt', 'w') as data:
name = 'My name xun_mi'
data.write(name)
實例
操作音樂文件
with open('三無MarBlue - 童話鎮(Cover 暗杠).mp3', 'rb') as music:
r = 1024*100
data = music.read(r)
with open('裁剪出的童話鎮.mp3', 'wb') as new:
new.write(data)
with open('三無MarBlue - 童話鎮(Cover 暗杠).mp3', 'rb') as data:
while True:
r = data.read(1024*1000)
if r == b'':
break
with open('新裁剪出的童話鎮.mp3', 'ab') as new:
new.write(r)
os模塊
os模塊是Python中一個內置的用來操作文件的模塊
下面我們來介紹一些常用方法。
方法 | 功能 |
---|---|
os.listdir(‘路徑,默認文件所在路徑’) | 讀取指定路徑目錄結構並作為返回值返回 |
os.getcwd() | 讀取當前文件所在目錄並作為返回值返回 |
os.chdir ('路徑‘’) | 用來改變文件當前所在路徑 |
os.mkdir(‘目錄名’) | 創建目錄 |
os.rmdir(‘目錄名’) | 刪除目錄(只能刪除空目錄,非空目錄會報錯) |
os.makedirs('目錄名’) | 生成多層目錄 |
os.removedirs('目錄名’) | 刪除多層空目錄(只能刪除空目錄,非空目錄會報錯) |
os.rename('原目錄名‘,'新目錄名’) | 目錄重命名 |
os.stat(‘目錄名或文件名’) | 讀取目錄或文件信息 |
os.name | 判斷當前系統信息,如果是Windows則返回nt,Linux則返回posix |
os.environ | 獲取系統變量 |
os.system('命令語句’) | 運行shell命令 |
import os
# listdir讀取指定路徑目錄結構
data = os.listdir('.')
print(data)
# getcwd讀取當前文件所在目錄
data = os.getcwd()
print(data)
# mkdir創建目錄
os.mkdir('我是os模塊創建的目錄')
# chdir用來改變文件當前所在路徑
os.chdir('./我是os模塊創建的目錄')
data = os.getcwd()
print(data)
# rmdir刪除一層目錄
os.rmdir('我是os模塊創建的目錄')
# makedirs生成多層目錄
os.makedirs('我是os創建的多層目錄\\第二層')
# removedirs刪除多層空目錄
os.removedirs('我是os創建的多層目錄')
# rename重命名文件
os.rename('我是os模塊創建的目錄', '我是經過重命名的文件')
# stat獲取文件或目錄信息
data1 = os.stat('我是os創建的多層目錄')
data2 = os.stat('os模塊.py')
print(data1, data2)
# name輸出當前運行系統環境Windows為nt,Linux為posix
data = os.name
# environ獲取系統變量(發現了有部分中文亂碼情況,但只是部分亂碼,很奇怪)
data = os.environ
# system運行shell命令(發生中文亂碼情況,這是字符編碼問題,默認字符編碼是GBK這個中文編碼,但是很奇怪會亂碼。解決方案1.使用chcp 65001將編碼改變成utf-8)
os.system('chcp 65001')
os.system('dir')