豬行天下之Python基礎——7.1 文件存儲

內容簡述:

  • 一、open()函數與文件打開模式
  • 二、file對象提供的函數
  • 三、常見的文件操做示例
  • 四、os模塊裏的經常使用函數
  • 五、實用代碼示例

一、open()函數與文件打開模式

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對象提供的函數

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
複製代碼

四、os模塊裏的經常使用函數

Python中爲咱們提供了一個os模塊用於處理文件和目錄,除此以外它的子模塊path模塊還提供了文件路徑相關的一些函數,經過這些函數能夠完成文件或者文件夾的批處理操做,好比文件批量更名,內容替換等。函數


① os模塊經常使用函數

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模塊經常使用函數

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_,而後一個個圖片重命名,學習完本節後咱們能夠動手寫一個批量文件重命名的腳本。

程序仍是比較簡單的,分兩步:

  • 1.獲取某個文件夾裏全部的文件完整路徑名
  • 2.調用file對象的rename函數僅限替換

具體代碼以下

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!


若是本文對你有所幫助,歡迎
留言,點贊,轉發
素質三連,謝謝😘~

相關文章
相關標籤/搜索