- 一、open()函數與文件打開模式
- 二、file對象提供的函數
- 三、常見的文件操做示例
- 四、os模塊裏的經常使用函數
- 五、實用代碼示例
Python中讀寫文件很是簡單,經過 open()函數
能夠打開文件並返回文件對象。咱們可使用help函數來查看open函數具體的參數:css
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
複製代碼
通常瞭解前兩個參數就夠了,file參數表明文件名,若是不帶上路徑的話,會在當前文件夾裏查找, 而mode參數表明文件的打開模式,有以下表所示的幾種打開模式:python
模式 | 做用 |
---|---|
r | 只讀模式打開,默認 |
w | 寫模式打開,若文件存在,先刪除,而後從新建立 |
a | 追加模式打開,追加到文件末尾,seek()指向其餘地方也沒用,文件不存在,自動建立 |
b | 二進制模式打開 |
t | 文本模式打開,默認 |
+ | 可讀寫模式,可配合其餘模式使用,好比r+,w+ |
x | 若是文件已存在,用此模式打開會引起異常 |
U | 通用換行符支持 |
另外,實用open函數打開文件時要作下:異常捕獲,好比下面這樣的代碼:程序員
f = open('test.txt', 'r')
複製代碼
若是test.txt文件不存在的話,會拋出一個FileNotFoundError錯誤
,因此須要進行異常捕獲。另外,文件使用完畢後必須關閉,文件對象會佔用操做系統的資源,操做系統同一時間能打開的文件數量也是有限的。因此爲了保證正常或發生異常的時候文件都能關閉,須要把關閉操做寫到finally塊裏,示例代碼以下:sql
try:
f = open('test.txt', 'r')
print(f.read())
finally:
if f:
f.close()
複製代碼
可是每次都要這樣寫的話顯得有些繁瑣了,可使用Python提供的with語句
來簡化這個操做。shell
with open('test/txt', 'r') as f:
print(f.read())
複製代碼
相比每次都要寫try-finally異常捕獲,這種方式簡潔得多,並且不用怕忘記關閉文件。編程
file對象提供了以下表所示的可供調用的方法:bash
函數 | 做用 |
---|---|
close() | 關閉文件,關閉後文件不能再進行讀寫操做 |
read(size=-1) | 從文件讀取指定的字節數,若是未設置或爲負數,讀取全部 |
next() | 返回文件下一行 |
readline() | 讀取整行,包括換行符'\n' |
seek(offset, from) | 設置當前文件指針的位置,從from(0文件起始位置,1當前位置, 2文件末尾)偏移offset個字節 |
tell() | 返回文件的當前位置 |
write(str) | 將字符串寫入文件 |
writelines(seq) | 寫入一個序列字符串列表,若是要換行,須要本身加入每行的換行符 |
truncate([size]) | 截斷文件並返回截斷的字節長度,指定長度就從開頭開始截斷指定長度, 其他內容刪除;不指定的話,從開頭截取到當前位置,其他內容刪除。 |
文件的經常使用操做有建立,寫入,讀取,還有追加,代碼示例以下:app
# 1.建立一個可讀寫的文件
def mk_file(file):
with open(file, 'w+', encoding='UTF-8') as f:
print("建立了一個可讀寫的文件:%s" % file)
# 2.往文件中寫入內容
def write_to_file(file, content):
with open(file, 'w+', encoding='UTF-8') as f:
f.write(content + '\n')
print("內容寫入成功!")
# 3.讀取文件裏的內容
def read_from_file(file):
with open(file, 'r+', encoding='UTF-8') as f:
print("輸出文件內容:" + f.read())
# 4.往文件追加內容
def append_to_file(file, content):
with open(file, 'a+', encoding='UTF-8') as f:
f.write(content + '\n')
print("內容追加成功!")
if __name__ == '__main__':
file_name = 'test.txt'
mk_file(file_name)
write_to_file(file_name, "人生苦短我用Python!")
read_from_file(file_name)
append_to_file(file_name, "Hello Python!")
read_from_file(file_name)
複製代碼
運行結果以下:編程語言
建立了一個可讀寫的文件:test.txt
內容寫入成功!
輸出文件內容:人生苦短我用Python!
內容追加成功!
輸出文件內容:人生苦短我用Python!
Hello Python!
複製代碼
Python中爲咱們提供了一個
os模塊
用於處理文件和目錄
,除此以外它的子模塊path模塊
還提供了文件路徑相關
的一些函數,經過這些函數能夠完成文件或者文件夾的批處理操做,好比文件批量更名,內容替換等。函數
os模塊經常使用的函數以下表所示:
函數 | 做用 |
---|---|
close() | 關閉文件,關閉後文件不能再進行讀寫操做 |
getcwd() | 返回當前工做目錄 |
chdir(path) | 改變當前工做目錄 |
listdir(path='.') | 不寫參數默認列舉當前目錄下全部文件和文件夾,'.'當前目錄, '..'上一層目錄 |
mkdir(path) | 建立文件夾,若存在會拋出FileExistsError異常 |
mkdirs(path) | 可用於建立多層目錄 |
remove(path) | 刪除指定文件 |
rmdir(path) | 刪除目錄 |
removedirs(path) | 刪除多層目錄 |
rename(old,new) | 重命名文件或文件夾 |
system(command) | 調用系統提供的小工具,好比計算器 |
walk(top) | 遍歷top參數指定路徑下全部子目錄,返回一個三元組(路徑, [包含目錄],[包含文件]) |
curdir | 當前目錄(.) |
pardir | 上一節目錄(..) |
sep | 路徑分隔符,Win下是'\',Linux下是'/' |
linesep | 當前平臺使用的行終止符,win下是'\r\n',Linux下是'\n' |
pathsep | 輸出用於分割文件路徑的字符串 |
name | 當前使用的操做系統 |
stat(path) | 獲取文件目錄信息 |
environ | 獲取系統環境變量 |
system("bash command") | 執行shell命令,直接顯示 |
os.path模塊經常使用的函數以下表所示:
函數 | 做用 |
---|---|
dirname(path) | 得到路徑名 |
basename(path) | 得到文件名 |
join(path1[,path2[,…]]) | 將路徑名與文件名拼接成一個完整路徑 |
split(path) | 分割路徑與文件名,返回元組(f_path, f_name),若是徹底使用目錄,它也會將最後一個目錄做爲文件名分離,且不會判斷文件或目錄 是否存在 |
splitext(path) | 分隔文件名與擴展名 |
getsize(file) | 得到文件大小,單位是字節 |
getatime(file) | 得到文件最近訪問時間,返回的是浮點型秒數 |
getctime(file) | 得到文件的建立時間,返回的是浮點型秒數 |
getmtime(file) | 得到文件的修改時間,返回的是浮點型秒數 |
exists(path) | 判斷路徑(文件或目錄)是否存在 |
isabs(path) | 判斷是否爲決定路徑 |
isdir(path) | 判斷是否存在且是一個目錄 |
isfile(path) | 判斷是否存在且是一個文件 |
islink(path) | 判斷是否存在且是一個符號連接 |
ismount(path) | 判斷是否存在且是一個掛載點 |
samefile(path1,path2) | 判斷兩個路徑是否指向同一個文件 |
好比說如今有這樣一批文件,文件內容都是:
1.Java是一門面向對象編程語言,不只吸取了C++語言的各類優勢,還摒棄了C++
裏難以理解的多繼承、指針等概念,所以Java語言具備功能強大和簡單易用兩個特徵。
Java語言做爲靜態面向對象編程語言的表明,極好地實現了面向對象理論,容許程序員
以優雅的思惟方式進行復雜的編程。
如今須要把文件裏的Java都替換成Python,咱們能夠經過編寫腳原本完成這項繁瑣的工做,具體代碼以下:
import os
def replace(dir_path, word_before, word_after):
file_list = []
# 遍歷得到文件地址
for f in os.listdir(dir_path):
file_list.append(os.path.join(dir_path, f))
# 打開文件,按行讀取,替換對應內容
for file in file_list:
with open(file, 'r+', encoding='UTF-8') as f:
content = f.read()
f.seek(0)
f.truncate()
f.write(content.replace(word_before, word_after))
if __name__ == '__main__':
replace(os.path.join(os.getcwd(), 'doc'), 'Java', 'Python')
複製代碼
運行結果以下:
1.Python是一門面向對象編程語言,不只吸取了C++語言的各類優勢,還摒棄了C++裏難以理解的多繼承、指針等概念,所以Python語言具備功能強大和簡單易用兩個特徵。Python語言做爲靜態面向對象編程語言的表明,極好地實現了面向對象理論,容許程序員以優雅的思惟方式進行復雜的編程。
複製代碼
有時咱們須要對一堆文件進行批量命名,好比須要把下面這樣的圖片名字統一改爲image_1這樣的形式。在學習本節以前,你可能須要複製下image_,而後一個個圖片重命名,學習完本節後咱們能夠動手寫一個批量文件重命名的腳本。
程序仍是比較簡單的,分兩步:
具體代碼以下:
import os
def rename(file_dir, model_name, file_type):
pos = 1
# 獲取文件夾下全部文件(包括文件夾)
file_list = os.listdir(file_dir)
for file in file_list:
# 判斷是否爲對應後綴的文件
if file.endswith(file_type):
try:
# 舊文件名
old_name = os.path.join(file_dir, file)
# 新文件名
new_name = os.path.join(file_dir, model_name + str(pos) + file_type)
os.rename(old_name, new_name)
pos = pos + 1
except:
continue
rename(os.path.join(os.getcwd(), 'res'), 'image_', '.png')
複製代碼
運行結果以下:
1s不到改完108個圖片,簡直不要太爽,真人生苦短,我用Python!
若是本文對你有所幫助,歡迎
留言,點贊,轉發
素質三連,謝謝😘~