Python基礎(chǔ)學(xué)習(xí)筆記(十二)文件和目錄

本節(jié)知識大綱:


圖片.png

一、文件目錄的基本操作

說明:由于Windows和macOS文件目錄系統(tǒng)的格式不同,下面代碼中的文件目錄格式是匹配macOS系統(tǒng)的
基本操作函數(shù):


圖片.png
1. 創(chuàng)建文件--mknod()方法和open()方法

(1)mknod方法

import os
# 創(chuàng)建文件
file_path = "./file_path.txt"
os.mknod(file_path)

在window平臺不支持這個操作,在Mac平臺雖然支持這個語法但是系統(tǒng)出于安全考慮也會拒絕這個操作,需要超級管理員權(quán)限。
(2)open方法
在桌面創(chuàng)建一個py_test.txt的文件

open("/Users/yushengtan/Desktop/py_test.txt",mode = "w",encoding = "UTF-8")

創(chuàng)建文件,文件都還沒有怎么使用參數(shù)w來寫入呢?因為在沒有文件的情況下,系統(tǒng)會默認(rèn)自動創(chuàng)建一個空白文件,這樣就達(dá)到了創(chuàng)建文件的功能。

2. 創(chuàng)建目錄--mkdir()方法

比如我們要在當(dāng)前目錄下創(chuàng)建一個py_test的空目錄

path = "./py_test"
if not os.path.exists(path):  # 如果目錄不存在
    os.mkdir(path)
else:
    print("文件已存在")

案例:
在桌面/Users/yushengtan/Desktop/文件夾創(chuàng)建一個Demo文件夾,在Demo中創(chuàng)建一個文本文件Test01.txt;

import os
# 創(chuàng)建目錄
path = "/Users/yushengtan/Desktop/Demo"
path_txt = path + "text01.txt"
if not os.path.exists(path):
    os.mkdir(path)
    print("目錄"+path+"創(chuàng)建成功!")
else:
    print("目錄"+path+"文件夾已經(jīng)存在")

# 創(chuàng)建文件
if not os.path.exists(path_txt):
    fd = open(path_txt,mode="w",encoding="UTF-8")
    print("文件"+path_txt+"創(chuàng)建成功!")
    fd.close()  # 資源釋放
else:
    print("文件創(chuàng)建失敗")
3. 刪除目錄和文件--rmdir()方法和remove()方法

案例:刪除test01.txt和Demo

import os
path = "/Users/yushengtan/Desktop/Demo"
path_txt = path + "text01.txt"
# 刪除文件
# 如果要刪除文件夾必須要保證文件夾是空的
if os.path.exists(path_txt):
    os.remove(path_txt)
    print("文件"+path_txt+"刪除成功!")
else:
    print("要刪除的文件"+path_txt+"不存在")

# 刪除目錄
if os.path.exists(path):
    os.rmdir(path_txt)
    print("文件"+path+"刪除成功!")
else:
    print("要刪除的文件"+path+"不存在")
4. 文件目錄程序完善

(1)跨平臺目錄分隔符
在windows系統(tǒng)里面支持的路徑分隔符是反斜杠\,Linux和macOS系統(tǒng)路徑分隔符是斜杠/;os.path.sep或者os.sep提供了自動匹配系統(tǒng)的路徑分隔符。
所以上面的代碼中的文件路徑在macOS系統(tǒng)下可以執(zhí)行,在Windows就不能執(zhí)行了,那么如何讓我們的程序可以跨平臺執(zhí)行呢?
解決辦法:代碼中路徑里的斜杠或者反斜杠通過os.path.sep來代替,這樣在不同的操作系統(tǒng)下,路徑會自動適配。
(2)異常處理
涉及到文件和目錄的讀寫和刪除一定要用上異常處理,因為會有很多意外的情況發(fā)生,捕獲異常來防止程序崩潰

二、創(chuàng)建多個文件

案例:在當(dāng)前系統(tǒng)的桌面目錄下創(chuàng)建一個文件夾Demo,在文件夾中創(chuàng)建10個文本文件(命名格式:Test+3為隨機數(shù)字)
難點:創(chuàng)建的文件名有可能重復(fù)
思路01:每次創(chuàng)建文件的的時候判斷是否已經(jīng)存在,如果存在則重新創(chuàng)建

import os
import random

# 方法01:每次創(chuàng)建文件的的時候判斷是否已經(jīng)存在,如果存在則重新創(chuàng)建
def get_file_name():
    return "Test"+"%03d"%(random.randint(0,999))+".txt"

path = os.path.sep+"Users"+os.path.sep+"yushengtan"+os.path.sep+"Desktop"+os.path.sep+"Demo"+os.path.sep
# 創(chuàng)建目錄
if not os.path.exists(path):
    try:
        os.mkdir(path)
        print("目錄創(chuàng)建成功!")
    except:
        print("目錄創(chuàng)建異常!")
else:
    print("目錄已經(jīng)存在")
# 通過循環(huán)創(chuàng)建文件
total_number = 10
current_number = 0
while current_number < total_number:
    # 構(gòu)建文件名
    file_path = path + get_file_name()
    # 判斷是否存在
    if not os.path.exists(file_path):
        try:
            global fd
            fd = open(file_path,mode="w",encoding="UTF-8")
            print("文件"+file_path+"創(chuàng)建成功!")
            current_number += 1
        except:
            print(file_path+"文件創(chuàng)建失敗")
        finally:
            fd.close()
    else:
        print("文件"+file_path+"已存在")

思路02:先構(gòu)建好10個不同的名字,然后依次創(chuàng)建

def get_file_name(num:int):
    file_name_list = []
    current = 0
    while current < num:
        # 判斷構(gòu)建的名稱是否重復(fù)
        temp_name = "Test"+"%03d"%(random.randint(0,999))+".txt"
        if temp_name not in file_name_list:
            file_name_list.append(temp_name)
            current += 1
    return file_name_list

# 根據(jù)列表創(chuàng)建文件
path = os.path.sep+"Users"+os.path.sep+"yushengtan"+os.path.sep+"Desktop"+os.path.sep+"Demo"+os.path.sep

# 創(chuàng)建目錄
if not os.path.exists(path):
    try:
        os.mkdir(path)
        print("目錄創(chuàng)建成功!")
    except:
        print("目錄創(chuàng)建異常!")
else:
    print("目錄已存在!")

# 創(chuàng)建文件
for i in get_file_name(10):
    path_file = path + i
    if not os.path.exists(path_file):
        global fd
        try:
            fd = open(path_file,mode="w",encoding="UTF-8")
            print("文件"+path_file+"創(chuàng)建成功")
        except:
            print("文件"+path_file+"創(chuàng)建失敗")
        finally:
            fd.close()
    else:
        print("文件已存在")

三、OS模塊常見的操作方法

1. os模塊常用操作函數(shù)
圖片.png

(1)getcwd()
獲取當(dāng)前的工作路徑

print(os.getcwd())

(2)chdir()
修改當(dāng)前工作路徑

path = os.path.sep+"Users"+os.path.sep+"yushengtan"+os.path.sep+"Desktop"+os.path.sep+"Demo"+os.path.sep
os.chdir(path)  # 調(diào)整當(dāng)前的工作路徑
file = "abc.txt"
if not os.path.exists(file):
    fd = open(file,mode="w",encoding="UTF-8")
    fd.close()

(3)listdir()
列出一個目錄下的所有的文件夾和子文件夾,返回list集合

list01 = os.listdir(os.path.sep+"Users"+os.path.sep+"yushengtan"+os.path.sep+"Desktop"+os.path.sep)
for i in list01:
    file = os.path.sep+"Users"+os.path.sep+"yushengtan"+os.path.sep+"Desktop"+os.path.sep+i
    if os.path.isfile(file):
        print("文件:"+file)
    else:
        print("目錄:"+file)

(4)mkdir()
創(chuàng)建單層目錄

path = os.path.sep+"Users"+os.path.sep+"yushengtan"+os.path.sep+"Desktop"+os.path.sep+"yusheng"+os.path.sep
if not os.path.exists(path):
    os.mkdir(path)

(5)makedir()
創(chuàng)建多層目錄

path = os.path.sep+"Users"+os.path.sep+"yushengtan"+os.path.sep\
       +"Desktop"+os.path.sep+"AAA"+os.path.sep+"BBB"
if not os.path.exists(path):
    os.makedirs(path)

(6)remove()
刪除文件

path = os.path.sep+"Users"+os.path.sep+"yushengtan"+os.path.sep\
       +"Desktop"+os.path.sep+"Demo"+os.path.sep+"abc.txt"
if os.path.exists(path):
    os.remove(path)

(7)rmdir()
刪除單層目錄

path = os.path.sep+"Users"+os.path.sep+"yushengtan"+os.path.sep\
       +"Desktop"+os.path.sep+"AAA"+os.path.sep+"BBB"
if os.path.exists(path):
    os.rmdir(path)

(8)removedits()
刪除多層目錄(僅需了解)
(9)rename()
重命名文件和目錄

path = os.path.sep+"Users"+os.path.sep+"yushengtan"+os.path.sep\
       +"Desktop"+os.path.sep+"Demo"
os.chdir(path)
os.rename("Test002.txt","yusheng.txt")

(10)walk(top)
遍歷top路徑下所有的子目錄,返回一個三元組:(路徑,【包含目錄】,【包含文件】)

path = os.path.sep+"Users"+os.path.sep+"yushengtan"+os.path.sep\
       +"Desktop"+os.path.sep+"Demo"
tuple01 = os.walk(path)
for root,dirs,files in tuple01:
    print(root)
    print(dirs)
    print(files)
2. os模塊常用路徑操作符
圖片.png

(1)os.curdir
指代當(dāng)前目錄

path = os.path.sep+"Users"+os.path.sep+"yushengtan"+os.path.sep+"Desktop"+os.path.sep
new_path = path + os.curdir
print(os.path.abspath(new_path))

輸出結(jié)果:

/Users/yushengtan/Desktop

(2)os.pardir()
指代上級目錄

path = os.path.sep+"Users"+os.path.sep+"yushengtan"+os.path.sep+"Desktop"+os.path.sep
new_path = path + os.pardir
print(os.path.abspath(new_path))

輸出結(jié)果:

/Users/yushengtan

(3)os.name
指代操作系統(tǒng)名稱:

print(os.name)

Windows系統(tǒng)輸出結(jié)果為:nt
macOS系統(tǒng)輸出結(jié)果為:posix

3. os模塊常用判斷函數(shù)
圖片.png
4. os模塊路徑常用函數(shù)
圖片.png

案例:獲取指定文件的創(chuàng)建時間

import time
import os
path = "/Users/yushengtan/Desktop/Demo/Test003.txt"
time_stamp = os.path.getctime(path)
print(time.asctime(time.localtime(time_stamp))) # 標(biāo)準(zhǔn)時間格式
print("上次訪問的時間:",time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time_stamp)))

輸出結(jié)果:

Sat Jul 11 18:56:47 2020
上次訪問的時間: 2020-07-11 18:56:47
5. 案例演示

把/Users/yushengtan/Desktop/Demo/中文件名為奇數(shù)的文件給刪除,顯示刪除前的文件總數(shù),刪除后的文件總數(shù),刪除了哪些文件;
思路
(1) 刪除前計算文件的數(shù)量,刪除后計算文件的數(shù)量,--通過函數(shù)來實現(xiàn)
(2)如何篩選文件名數(shù)字為奇數(shù)(A:是文件,不是文件夾;B:包含的數(shù)字是奇數(shù))--通過正則表達(dá)式效率更高
(3)刪除前存入list,因為要打印要刪除哪些文件

import os
import re

def get_file_number(path):
    """
    統(tǒng)計出相應(yīng)目錄下的文件數(shù)量
    :param path: 提供的目錄
    :return: 文件的數(shù)量
    """
    total_list = os.listdir(path = path)
    file_number = 0
    for i in total_list:
        abs_path = path + i
        if os.path.isfile(abs_path):
            file_number += 1
    return file_number
def get_file(path):
    """
    找出文件中文件名為奇數(shù)的文件
    ~~~~~~~~~~~~~~~~~~~~~~
    :param path: 提供的路徑
    :return: 返回文件名稱的集合
    """
    total_file = os.listdir(path = path)
    # 實例化一個正則表達(dá)式對象
    pattern = re.compile(r"[\w]+[13579][.][\w]")
    # 新建list,存儲匹配上的文件名
    need_file = []
    # 遍歷
    for i in total_file:
        if pattern.search(i):
            need_file.append(i)
    return need_file
def delete_file(file_list,path):
    """
    刪除指定路徑的下文件
    ~~~~~~~~~~~~~~~~~~
    :param file_list: 提供要刪除文件的list
    :param path: 刪除文件的連接
    :return:
    """
    for current in file_list:
        abs_path = path + current
        try:
            os.remove(abs_path)
        except Exception as e:
            raise e



if __name__ == '__main__':
    path = "/Users/yushengtan/Desktop/Demo/"

    # 打印刪除前文件的數(shù)量
    print("刪除前的文件數(shù)量",get_file_number(path))

    # 找出文件名為奇數(shù)的文件
    file_list = get_file(path)
    print(file_list)

    # 刪除符合條件的文件
    try:
        delete_file(file_list,path)
    except:
        print("刪除出現(xiàn)異常!")
    else:
        print("刪除已成功!")

    # 刪除完后數(shù)量統(tǒng)計
    print("刪除后的文件數(shù)量", get_file_number(path))

    # 刪除的文件內(nèi)容

    for i in file_list:
        print(i)
6.案例演示:統(tǒng)計文件信息

統(tǒng)計出某個目錄下的文件的信息,信息包含:文件的名稱、類型、大小、創(chuàng)建時間:

import time
import os
import re

def get_all_files(path):
    total_list = os.listdir(path)
    file_list = []
    # 篩選出文件
    for current in total_list:
        abs_path = path + current
        if os.path.isfile(abs_path):
            file_list.append(current)
    # 返回文件的列表
    return file_list
def get_file_name(filename):
    pattern = re.compile("[\w]*(?=[.])")
    return pattern.search(filename).group()

def get_file_type(filename,path):
    type_dic = {
        "文本文件":["txt"],
        "圖片文件":["bmp","jpg","png"],
        "office文件":["docx","doc","xls","ppt"],
        "音頻文件":["mp3"],
        "視頻文件":["mp4","avi"]
        }
    # 獲取字典的key的list
    name_list = list(type_dic.keys())
    # 獲取value的list
    value_list = list(type_dic.values())
    # 獲取文件的后綴
    current_type = os.path.splitext(path + filename)[1][1:]
    # 判斷屬于哪個類型
    for i in range(0,len(value_list)):
        if current_type in value_list[i]:
            return name_list[i]

def format_datetime(time_number:float):
    return time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time_number))

if __name__ == '__main__':
    # 【1】獲取指定目錄下的所有的文件
    path = "/Users/yushengtan/Desktop/Demo/"
    file_list = get_all_files(path)
    # 【2】遍歷獲取的文件,依次獲得類型、大小、創(chuàng)建時間、修改時間信息
    all_file_info = []  # 存儲所有文件的所有信息
    # 遍歷
    for current_file in file_list:
        temp_file_info = []
        # 添加文件信息
        temp_file_info.append(get_file_name(current_file))

        # 添加文件類型
        temp_file_info.append(get_file_type(current_file,path))

        # 添加文件大小
        temp_file_info.append(os.path.getsize(path+current_file)/1024)

        # 添加文件創(chuàng)建時間
        temp_file_info.append(format_datetime(os.path.getctime(path+current_file)))
        all_file_info.append(temp_file_info)


    # 【3】打印
    print("文件名稱     文件類型    文件大小   單位(大小kb)  創(chuàng)建時間")
    print("======================================================")
    for i in all_file_info:
        print(i[0],end="\t\t")
        print(i[1], end="\t\t")
        print("%10s" % i[2], end="\t\t")
        print("%-20s" % i[3], end="\n")

四、讀取文件

1. 讀取文件的基本演示

打開和讀取文件最好要用異常處理,open()方法創(chuàng)建一個打開文件的對象,

fd = open(path,mode="r",encoding="UTF-8")

再調(diào)用read()方法讀取內(nèi)容存儲在變量中。

content = fd.read()

案例:
讀取指定文件夾下的文本文件,篩選出手機號碼

import re
def get_mobile(text):
    """
    在文本中找出手機號碼
    ~~~~~~~~~~~~~~~~~~~~~~~~~
    :param text: 提供的文本
    :return: 返回手機號碼的list
    """
    # 實例化一個正則表達(dá)式對象
    pattern = re.compile(r"[1][3578][\d]{9}")
    # 獲取匹配的結(jié)果
    mobile_list = pattern.findall(text)
    # 返回
    return mobile_list

if __name__ == "__main__":
    # 步驟01:打開文件
    path = "/Users/yushengtan/Desktop/Demo/student.txt"
    global fd, content
    try:
        fd = open(path,mode="r",encoding="UTF-8")
    # 步驟02:讀取
        content = fd.read() # 把所有內(nèi)容存儲在變量(內(nèi)存)中
        print(content)
    except IOError as e:
        print("打開文件出現(xiàn)異常!")
    except Exception as e:
        print("未知異常")
    finally:
        fd.close()
    # 步驟03:處理內(nèi)容
    list_mobile = get_mobile(content)
    # 輸出
    print("獲取的手機號碼有:")
    for i in list_mobile:
        print(i)
2. with關(guān)鍵字讀取文本文件

使用with讀取的好處在于不需要手動關(guān)閉資源,讀取完成后系統(tǒng)自動關(guān)閉;
了解一個文件對象是否關(guān)閉,可以直接查看其closed屬性,如果是True則表明已經(jīng)關(guān)閉;

print("打開的文件是否關(guān)閉",fd.closed)

案例:使用with關(guān)鍵字讀取文本文件

path = "/Users/yushengtan/Desktop/Demo/student.txt"
with open(path,mode="r",encoding="UTF-8") as fd:
    print(fd.read())
3. 打開文件模式和編碼

open函數(shù)
open(文件路徑,模式mode="",編碼encoding="")
r --- 讀取文本文件
rb --- 讀取二進(jìn)制文件(非Unicode編碼存儲的文件,如圖片、音頻、視頻)

4. 讀取文件的三種方式

(1)read() 每次讀取整個文件,它通常用于將文件內(nèi)容放到一個字符串變量中

with open(path,mode="r",encoding="UTF-8") as fd:
    content = fd.read()
print(content)

(2)readlines() 逐行讀取,將文件內(nèi)容返回到一個列表中,每一個元素就是一行

with open(path,mode="r",encoding="UTF-8") as fd:
    content_list = fd.readlines()
for i in content_list:
    print(i,end="")

(3)readline() 每次只讀取一行,通常比readlines()慢得多,僅當(dāng)沒有足夠內(nèi)存可以一次讀取整個文件時才應(yīng)該使用readline()

with open(path,mode="r",encoding="UTF-8") as fd:
    content = fd.readline() # 讀取一行
    while content:  # 如果有內(nèi)容,循環(huán)執(zhí)行,如果沒有內(nèi)容那么循環(huán)結(jié)束
        print(content,end="")
        content = fd.readline() # 讀取下一行
5. 讀取大文件

(1)常規(guī)做法
如果讀取的文件特別大,內(nèi)存不夠會導(dǎo)致內(nèi)存溢出MemoryError,常規(guī)的解決辦法有兩種:

  • 如果文件有分行,使用readline()方法;
  • 如果沒有分行,使用read(size)方法
    (2)推薦做法
    使用with結(jié)構(gòu)的迭代器,進(jìn)行迭代遍歷,for line in f,會自動地使用緩沖IO以及內(nèi)存管理,而不必?fù)?dān)心任何大文件的問題。
with open(path,mode="r",encoding="UTF-8") as f:
    for line in f:
        print(line,end="")
6. 讀取二進(jìn)制文件

計算機數(shù)據(jù)存儲在物理上是二進(jìn)制的,所有文本文件與二進(jìn)制文件的區(qū)別并不是物理上的,而是邏輯上的。這兩者只是在編碼層次上有差異,文本文件是基于字符編碼的文件,常見的編碼由ASCII編碼,Unicode編碼等等。二進(jìn)制文件是基于值編碼的文件,常見的編碼有Base64編碼。
使用Base64編碼存儲圖片、讀取圖片、展示圖片;
案例:
將文件夾中的圖片轉(zhuǎn)為base64編碼的二進(jìn)制文件,并寫入磁盤

import base64
path = "/Users/yushengtan/Desktop/Demo/2.png"
with open(path,mode="rb") as fd:
    image_data = fd.read()  # 讀取圖片文件
    base64_data = base64.b64encode(image_data)
    # 把編碼文件存儲到磁盤
    write_image = open("/Users/yushengtan/Desktop/Demo/base64_image.txt","wb")
    write_image.write(base64_data)
    write_image.close()

案例:
將base64編碼的二進(jìn)制文件解碼成圖片并寫入磁盤

path = "/Users/yushengtan/Desktop/Demo/base64_image.txt"
with open(path,mode= "rb") as fd:
    base64_data = fd.read() # 讀取二進(jìn)制文件
    image_data = base64.b64decode(base64_data)  # 把二進(jìn)制base64文件解碼
    # 將圖片轉(zhuǎn)存到磁盤
    write_image = open("/Users/yushengtan/Desktop/Demo/image_write.png","wb")
    write_image.write(image_data)
    write_image.close()
7. 綜合案例

案例:在某文件夾中有file01和file02,找出兩個文檔中相同的手機號碼;

import os
import re
def get_mobile(path):
    """
    更加提供的文件路徑,找出該文件所有的手機號碼
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    :param path: 文件路徑
    :return: 手機號碼的列表
    """
    # 準(zhǔn)備判斷手機號碼的正則表達(dá)式對象
    pattern = re.compile(r"[1][3578][\d]{9}")
    # 定義一個變量存儲文本內(nèi)容
    content = ""
    # 定義存儲手機號碼的list
    mobile_list = []
    if not os.path.isfile(path):
        return 0
    else:
        # 讀取里面所有的內(nèi)容到文本

        try:
            with open(path,"r") as fd:
                content = fd.read()
        except Exception as e:
            raise e
    # 使用正則表達(dá)式匹配
    mobile_list = pattern.findall(content)
    # 返回
    return mobile_list

if __name__ == '__main__':
    path01 = "/Users/yushengtan/Desktop/Demo/file01.txt"
    path02 = "/Users/yushengtan/Desktop/Demo/file02.txt"
    # 獲取file01中的手機號碼
    file01_mobile = []
    file02_mobile = []
    set01 = set()
    try:
        file01_mobile = get_mobile(path01)
        file02_mobile = get_mobile(path02)
    except:
        print("獲取手機號碼出現(xiàn)異常!")
    # 找出相同的,遍歷file01_mobile
    print("兩個文件中相同的手機號碼為:",end=" ")
    for mobile in file01_mobile:
        if mobile in file02_mobile:
            set01.add(mobile)
    # 打印set集合
    print(set01)

五、文件的寫入

讀文件是把文件的中的內(nèi)容讀取程序中來,寫文件是把程序中的內(nèi)容寫入到文件中去;

1.寫入文件的基本演示

(1)傳統(tǒng)方式寫入
通過open創(chuàng)建打開對象后操作完成要手動關(guān)閉文件;

path = "/Users/yushengtan/Desktop/Demo/w_file01.txt"
global fd
try:
    fd = open(path,mode="w",encoding="UTF-8")
    fd.write("yusheng123.cn")
except Exception as e:
    print("寫入文件出現(xiàn)異常!")
else:
    print("寫入成功!")
finally:
    fd.close()

(2)使用with關(guān)鍵字寫入
調(diào)用完成后自動關(guān)閉文件

path02 = "/Users/yushengtan/Desktop/Demo/w_file02.txt"
with open(path02,mode="w",encoding="UTF-8") as fd:
    try:
        fd.write("yusheng123.cn")
    except:
        print("寫入file02失敗")
    else:
        print("寫入file02成功")

注意:
當(dāng)mode = "w"時:
以寫的方式打開,只能寫文件;
如果文件不存在,創(chuàng)建該文件;
如果文件已經(jīng)存在,先清空,再打開文件。
只能寫入字符類型

2.write和writelines

write寫入單行,writelines多行寫入,多行寫入不是直接寫入,是要把要寫入的字符串存入列表、元組、集合、字典(key),然后再寫入

with open(path02, mode="w", encoding="UTF-8") as fd:
    # 寫入多行需要借助于列表、元組 、集合、字典
    list01 = ["1000","2000","3000"] # list集合可以作為多行寫入的參數(shù)
    tuple01 = ("tuple1000","tuple2000","tuple3000")    #元組集合可以作為多行寫入的參數(shù)
    set01 = {"set1000","set2000","set3000"} # set集合也可以作為多行寫入的參數(shù)
    dit01 = {"上海":3000,"北京":4000,"廣州":3000} # 字典集合也可以作為多行寫入的參數(shù),但是只寫入key

    # 處理list:寫完一行后換行
    for i in range(0,len(list01)):
        list01[i] = "第" + str(i+1) + "個元素" + list01[i] + "\n"
        i += 1
    # 輸出經(jīng)過處理的結(jié)果
    fd.writelines(list01)   # 寫入list集合

案例演示:
在文件夾中有一個txt文件有很多手機號碼,提取手機號碼寫入到mobile.txt中;

import re
import os

path_write = "/Users/yushengtan/Desktop/Demo/mobile.txt"
def get_mobile(path):
    """
    提取文件中的手機號碼
    ~~~~~~~~~~~~~~~~~
    :param path: 文件路徑
    :return: 手機號碼列表
    """
    pattern = re.compile(r"[1][3578]\d{9}")
    # 判斷是不是文件
    if not os.path.isfile(path):
        raise Exception("提供的文件不存在!")
    else:
        # 讀取內(nèi)容
        try:
            with open(path,mode="r",encoding="UTF-8") as fd:
                return pattern.findall(fd.read())
        except Exception as e:
            raise Exception("獲取手機號碼出現(xiàn)異常!")


if __name__ == '__main__':
    # 讀取文件的手機號碼
    path = "/Users/yushengtan/Desktop/Demo/student.txt"
    mobile_list = []
    try:
        mobile_list = get_mobile(path)
    except Exception as e:
        print(e)
    print(mobile_list)
    # 處理list---【1】去重;【2】換行
    for index in range(len(mobile_list)):
        mobile_list[index] = mobile_list[index] + "\n"
    # 轉(zhuǎn)換為set集合
    set01 = set(mobile_list)
    # 輸出到文件
    new_path = os.path.dirname(path) + os.path.sep + "mobile.txt"
    try:
        with open(new_path,mode="w",encoding="UTF-8") as fd:
            fd.writelines(mobile_list)
    except:
        print("寫入文件出現(xiàn)異常!")
    else:
        print("手機號碼寫入到文件成功!")
3.追加寫入

在文件寫入時使用mode參數(shù)如果是w,在打開文件時會將文件內(nèi)容清空,如果我們想保留前面寫入的內(nèi)容就要使用追加寫入的方法。
打開一個文件用于追加,如果該文件已經(jīng)存在,文件指針將會放在文件結(jié)尾,新的內(nèi)容將會被寫入到已有的文件內(nèi)容之后,如果該文件不存在,創(chuàng)建新文件進(jìn)行寫入。
追加寫入的關(guān)鍵字是append,相應(yīng)mode后的參數(shù)為a
案例:
追加寫入到mobile.txt一個手機號碼

path = "/Users/yushengtan/Desktop/Demo/mobile.txt"
mobile_number = "18812345678"
try:
    with open(path,mode="a",encoding="UTF-8") as fd:
        fd.write("追加寫入的手機號碼:"+mobile_number)
except:
    print("寫入文件出現(xiàn)異常!")
else:
    print("追加號碼寫入成功!")
4.讀寫模式

Python文件讀寫模式有以下幾種:


圖片.png
重點掌握:

(1)r 只讀模式
open()函數(shù)的默認(rèn)模式,只能讀,不能寫;
(2)w 只寫模式
打開前清空文件內(nèi)容,只能寫,不能讀;
(3)a 追加模式
打開前不清空文件內(nèi)容,只能追加寫入,不能讀;
(4)r+ 可讀可寫模式
不會創(chuàng)建不存在的內(nèi)容,從頂部開始寫入,寫多少覆蓋多少;
如果先讀后寫,結(jié)果就是追加寫入;如果先寫后讀,結(jié)果是覆蓋文檔相應(yīng)位置字符,讀取的時候,從寫入之后的位置開始讀取
(5)w+ 可讀可寫
如果文件存在則覆蓋整個文件,不存在則創(chuàng)建文件,創(chuàng)建完成后立馬就讀是讀不到的,因為此時文件指針在文件的結(jié)尾處,如果要讀取文件需要將文件指針指向文件開頭fd.seek(os.SEEK_SET)

import os
print("=======w+ 模式=======")
path = "/Users/yushengtan/Desktop/Demo/mobile1.txt"
with open(path,mode="w+") as fd:
    fd.write("yusheng")
    fd.seek(os.SEEK_SET)
    print(fd.read())

(6)a+ 可讀可寫模式
從文件頂部讀取內(nèi)容,從文件底部添加內(nèi)容,不存在則創(chuàng)建,同樣的道理,如果寫入文件后直接讀取是讀取不到的,因為此時文件指針指向底部,如果想讀取文件內(nèi)容則需手動將文件指針指向文件頂部。與w+模式的區(qū)別是可追加的讀寫。

5.案例演示

在文件夾中某個指定的txt文件中有一些號碼,為這些手機號碼加上編號。
思路:【1】讀出內(nèi)容【2】編輯內(nèi)容 【3】寫入內(nèi)容

def get_mobile(path):
    """
    讀取指定路徑下的所有手機號
    ~~~~~~~~~~~~~~~~~~~~~~~
    :param path: 提供的文本路徑
    :return: 所有的手機號碼列表
    """
    try:
        with open(path,mode="r",encoding="UTF-8") as fd:
            content = fd.read()
            if len(content) == 0:
                raise Exception("沒有任何內(nèi)容!")
            else:
                return content.split("\n")
    except:
        raise Exception("讀取文件出錯!")

if __name__ == '__main__':
    # 讀取指定路徑下的手機號碼
    path = "/Users/yushengtan/Desktop/Demo/mobile.txt"
    mobile_list = get_mobile(path)
    # 處理
    for i in range(len(mobile_list)):
        mobile_list[i] = str(i+1) + ")" + mobile_list[i]+"\n"
    print(mobile_list)
    # 寫入
    with open(path,mode="w",encoding="UTF-8") as fd:
        try:
            fd.writelines(mobile_list)
        except:
            print("寫入出現(xiàn)異常!")
        else:
            print("添加手機號碼的編號成功")
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容