<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      song1002  

      【一】深淺拷貝

      【1】深淺拷貝問題

      • 無論深拷貝還是淺拷貝都是用來 復(fù)制對(duì)象的
      • 如果是淺copy,只會(huì)復(fù)制一層,如果copy的對(duì)象中有可變數(shù)據(jù)類型,修改可變數(shù)據(jù)類型還會(huì)影響拷貝的對(duì)象
      • 如果是深copy,完整復(fù)制,無論可變或不可變,都是創(chuàng)建出新的來,以后再改原對(duì)象,都不會(huì)對(duì)copy出的對(duì)象造成影響
      # 給你一個(gè)列表 ---> 基于這個(gè)列表進(jìn)行更改生成新的列表
      # 方式一:將原本的列表復(fù)制一份一模一樣的
      # 支隊(duì)新列表生效,對(duì)原來的列表不生效
      # num_list = [1, 2, 3]
      # num_list_new = [1, 2, 3]
      # num_list_new.append(4)
      # print(num_list)
      # print(num_list_new)
      [1, 2, 3]
      [1, 2, 3, 4]
      
      # 方式二:用新的變量名指向原來的列表 ---> 連續(xù)復(fù)制
      # 對(duì)新列表和原來的列表都生效
      num_list = [1, 2, 3]
      num_list_new = num_list
      num_list_new.append(4)
      print(num_list_new)
      print(num_list)
      [1, 2, 3, 4]
      [1, 2, 3, 4]
      
      

      【2】復(fù)制原本的列表會(huì)產(chǎn)生的問題

      # 新列表是復(fù)制出來的副本
      # 【1】修改新列表會(huì)影響到原本的列表 ----> 淺拷貝
      # 【2】修改新列表不會(huì)影響到原本的列表 ---> 深拷貝
      

      【3】在python代碼中實(shí)現(xiàn)深淺拷貝

      # 【1】淺拷貝
      # 必須是修改源數(shù)據(jù)類型中的可變數(shù)據(jù)類型才生效
      # num_list = [1, 2, 3, 4, [1, 2]]
      # num_list_new = copy.copy(num_list)
      # num_list_new[4].append(5)
      
      # print(num_list, id(num_list))
      # print(num_list_new, id(num_list_new))
      # [1, 2, 3, 4, [1, 2, 5]] 2504131502208
      # [1, 2, 3, 4, [1, 2, 5]] 2504131490752
      
      # 【2】深拷貝
      # 深拷貝會(huì)將原來的列表完全復(fù)制一份,修改新列表不會(huì)影響到原來的列表
      # num_list = [1, 2, 3, 4, [1, 2]]
      # num_list_new = copy.deepcopy(num_list)
      # num_list_new[4].append(5)
      #
      # print(num_list, id(num_list))
      # print(num_list_new, id(num_list_new))
      
      [1, 2, 3, 4, [1, 2]] 1819253367104
      [1, 2, 3, 4, [1, 2, 5]] 1819253366272
      

      【總結(jié)】

      # 淺拷貝只會(huì)復(fù)制頂層對(duì)象,而不會(huì)影響到深層的可變數(shù)據(jù)類型
      # 在復(fù)制出來的列表,列表中的列表引用的是原來列表的引用
      
      # 深拷貝會(huì)遞歸的復(fù)制整個(gè)對(duì)象的數(shù)據(jù)結(jié)構(gòu)
      # 在復(fù)制出來的列表,列表中的列表引用的是新列表的引用
      

      【二】垃圾回收處理機(jī)制(GC機(jī)制)

      【1】什么是垃圾回收處理機(jī)制

      # 垃圾回收機(jī)制是(GC機(jī)制)python自帶的一種機(jī)制
      # 專門用來回收變量值所占的內(nèi)存空間
      
      # 每節(jié)課都寫了一個(gè) py 文件
      # 180添加 --》 180個(gè)文件(至少) ---> 有的文件只是臨時(shí)測(cè)試的文件
      # 一般不會(huì)主動(dòng)刪除不必要的文件 ---> 文件越堆越多 --> 硬盤中的空間也會(huì)越戰(zhàn)越多
      
      # 以后隨著學(xué)習(xí)你會(huì)在你的解釋器上安裝很多第三方的包
      # ---> 每次打開pycahrm都有一個(gè)自動(dòng)檢索當(dāng)前安裝包的機(jī)制
      # 如果電腦配置跟不上---> 五分鐘
      

      【2】在python中的垃圾

      # 每次書寫Python代碼都會(huì)創(chuàng)建很多變量名和變量值
      # 但是有很多變量名和變量值 用過一次就不用了
      # ---> 被稱之為垃圾 ---> 不會(huì)主動(dòng)清理掉垃圾
      # name = 'dream'
      # print(name)
      # del name
      # print(name)
      # 在python解釋器內(nèi)部自帶了一個(gè)垃圾回收機(jī)制
      

      【3】堆和棧的概念

      # 棧區(qū):變量名和值內(nèi)存地址關(guān)聯(lián)的區(qū)域
      # 堆區(qū):變量值存放的區(qū)域
      

      【4】三個(gè)名詞

      # 引用計(jì)數(shù)為主,標(biāo)記清除為輔,分代回收
      
      # 【1】引用計(jì)數(shù)
      # 變量值被變量名指向的次數(shù)
      # x = 10  # 1
      # y = x  # 2
      # x = 11
      # y = 12
      
      # 【2】標(biāo)記清除
      # 當(dāng)一個(gè)變量值被引用的時(shí)候,Python自帶的垃圾回收機(jī)制會(huì)定期掃描
      # 如果這個(gè)變量值有引用 ---> 不管
      # 如果這個(gè)變量值沒有引用 ---> 標(biāo)記
      
      # 【3】分代回收
      # 新生代 --> 第一次被掃描,扔到新生代中
      # 青春代 --> 知道達(dá)到新生代掃描閾值,如果還沒人指向直接挪到 青春代
      # 老年代 --> 知道達(dá)到青春代掃描閾值,如果還沒人指向直接挪到 老年代
      # ---> 知道達(dá)到老年代掃描閾值,如果還沒人指向直接清除 del
      

      【5】棧區(qū)和堆區(qū)

      # 【1】堆區(qū)
      # 變量值存放于堆區(qū),內(nèi)存管理回收的則是堆區(qū)的內(nèi)容
      # # 在Python中,變量和它們所引用的對(duì)象(如數(shù)值、字符串、列表、字典等)的存儲(chǔ)位置與內(nèi)存管理機(jī)制密切相關(guān)。
      # # 這里提到的“變量值存放于堆區(qū)”主要涉及兩個(gè)概念:變量本身和它所引用的對(duì)象。
      # # 1. 變量
      #    變量是程序中用于標(biāo)識(shí)數(shù)據(jù)的一個(gè)符號(hào)或名字,它并不直接存儲(chǔ)數(shù)據(jù),而是指向(或引用)實(shí)際存儲(chǔ)數(shù)據(jù)的內(nèi)存地址。
      #    在Python解釋器內(nèi)部,變量名通常保存在棧(Stack)中。棧是一種后進(jìn)先出(LIFO)的數(shù)據(jù)結(jié)構(gòu),用于高效地管理函數(shù)調(diào)用時(shí)的局部變量、返回地址等信息。
      #    當(dāng)創(chuàng)建一個(gè)變量時(shí),Python會(huì)在當(dāng)前作用域(如全局作用域或函數(shù)局部作用域)的??臻g內(nèi)為該變量分配一個(gè)名稱,并將其關(guān)聯(lián)到相應(yīng)的對(duì)象。
      # # 2. 對(duì)象及值
      #    Python中的對(duì)象(即變量所引用的實(shí)際數(shù)據(jù))通常存儲(chǔ)在堆(Heap)中。
      #    堆是一種動(dòng)態(tài)分配內(nèi)存的區(qū)域,相比于棧,其大小更為靈活且無固定上限。
      #    堆用于存儲(chǔ)需要大量、不固定大小內(nèi)存空間的數(shù)據(jù)結(jié)構(gòu),如大數(shù)組、復(fù)雜的數(shù)據(jù)類型(如類實(shí)例)、以及那些生命周期可能跨越多個(gè)函數(shù)調(diào)用或作用域的對(duì)象。
      # # 將對(duì)象值存放在堆區(qū)有以下幾個(gè)原因:
      # # - 靈活性
      # 		堆內(nèi)存的大小可以動(dòng)態(tài)調(diào)整,能夠適應(yīng)不同大小和復(fù)雜度的對(duì)象。
      #     這使得Python可以在運(yùn)行時(shí)根據(jù)需要?jiǎng)?chuàng)建任意大小的對(duì)象,無需預(yù)先確定其具體尺寸,非常適合處理變長數(shù)據(jù)結(jié)構(gòu)(如列表、字典)。
      # # - 共享性
      # 		多個(gè)變量可以同時(shí)引用同一塊堆內(nèi)存中的對(duì)象,實(shí)現(xiàn)對(duì)象的共享。
      #     這種機(jī)制允許通過賦值、參數(shù)傳遞、返回值等方式高效地復(fù)制“引用”,而不是復(fù)制整個(gè)對(duì)象內(nèi)容,節(jié)省了內(nèi)存資源并提高了效率。
      # # - 垃圾回收
      # 		由于堆內(nèi)存中的對(duì)象可能存在多個(gè)引用,Python使用垃圾回收(Garbage Collection, GC)機(jī)制自動(dòng)追蹤和管理對(duì)象的生命周期。
      #     當(dāng)一個(gè)對(duì)象不再有任何引用時(shí),GC會(huì)識(shí)別并釋放其占用的堆內(nèi)存,防止內(nèi)存泄漏。
      #     堆區(qū)便于實(shí)施這樣的垃圾回收策略,確保程序長期運(yùn)行時(shí)內(nèi)存的有效利用。
      # # 綜上所述
      # 		Python將變量值(即對(duì)象)存放于堆區(qū),主要是為了提供靈活的內(nèi)存分配、支持對(duì)象共享以及實(shí)現(xiàn)自動(dòng)化的垃圾回收,這些特性對(duì)于編寫高效、健壯的Python程序至關(guān)重要。
      #     而變量本身作為對(duì)象的引用,則通常存儲(chǔ)在棧區(qū),便于快速訪問和管理其生命周期。
      
      
      # 【2】棧區(qū)
      # 變量名與值內(nèi)存地址的關(guān)聯(lián)關(guān)系通常被存放于程序的棧區(qū)
      
      # # 1. 棧區(qū)的特性與作用
      #    棧(Stack)是計(jì)算機(jī)內(nèi)存中的一種數(shù)據(jù)結(jié)構(gòu),其主要特點(diǎn)是后進(jìn)先出(LIFO)。在編程語言執(zhí)行過程中,棧區(qū)用于存儲(chǔ)局部變量、函數(shù)參數(shù)以及函數(shù)調(diào)用時(shí)的返回地址等臨時(shí)性信息。
      #    棧區(qū)的操作快速且高效,因?yàn)樗裱?jiǎn)單的壓棧(push)和彈棧(pop)規(guī)則,適合處理那些生命周期短、使用頻繁且需要保持特定順序的數(shù)據(jù)。
      # # 2. 變量生命周期管理
      #    變量名與值內(nèi)存地址的關(guān)聯(lián)關(guān)系本質(zhì)上是一種符號(hào)表信息,它記錄了源代碼中定義的變量名與其所對(duì)應(yīng)的內(nèi)存地址之間的映射。
      #    這種信息具有明顯的生命周期特征:當(dāng)進(jìn)入一個(gè)作用域(如函數(shù)或代碼塊)時(shí),新聲明的變量及其關(guān)聯(lián)關(guān)系應(yīng)被創(chuàng)建;
      #    當(dāng)離開該作用域時(shí),這些變量及關(guān)聯(lián)關(guān)系應(yīng)被自動(dòng)清理以釋放資源。棧區(qū)恰好符合這種對(duì)變量生命周期進(jìn)行嚴(yán)格管理的需求。
      #    每當(dāng)函數(shù)調(diào)用發(fā)生時(shí),會(huì)在棧頂為該函數(shù)分配一塊空間,用于存放其內(nèi)部聲明的變量及其關(guān)聯(lián)關(guān)系;函數(shù)調(diào)用結(jié)束時(shí),這部分??臻g會(huì)被自動(dòng)回收
      # # 3. 性能優(yōu)化
      #    棧區(qū)訪問速度極快,因?yàn)樗膬?nèi)存地址通常連續(xù)且靠近CPU寄存器。將變量名與值內(nèi)存地址的關(guān)聯(lián)關(guān)系放在棧上,可以確保編譯器和運(yùn)行時(shí)系統(tǒng)能以較低的時(shí)間成本查找并操作這些信息。特別是在遞歸調(diào)用、循環(huán)等頻繁涉及變量訪問的場(chǎng)景下,棧區(qū)的高效訪問對(duì)于提升程序整體性能至關(guān)重要
      # # 4. 內(nèi)存安全性
      #    棧區(qū)的內(nèi)存由編譯器自動(dòng)分配和釋放,不易出現(xiàn)內(nèi)存泄漏問題。將變量名與值內(nèi)存地址的關(guān)聯(lián)關(guān)系存儲(chǔ)在棧上,有助于防止因程序員手動(dòng)管理內(nèi)存不當(dāng)而導(dǎo)致的錯(cuò)誤。此外,棧區(qū)的大小通常有限制,這有助于防止因局部變量過度使用內(nèi)存而導(dǎo)致的堆棧溢出問題,從而提高程序穩(wěn)定性
      # # 5. 線程安全性
      #    每個(gè)線程都有自己的??臻g,這意味著不同線程中的同名局部變量各自擁有 ** 的內(nèi)存地址和關(guān)聯(lián)關(guān)系,互不影響。這一特性保證了并發(fā)環(huán)境下的數(shù)據(jù)安全,避免了線程間的數(shù)據(jù)混淆。
      # # 綜上所述
      #     將變量名與值內(nèi)存地址的關(guān)聯(lián)關(guān)系存放于棧區(qū),既利用了棧區(qū)的特性實(shí)現(xiàn)了高效的內(nèi)存管理、快速訪問和嚴(yán)格的生命周期控制,又確保了內(nèi)存安全性與線程安全性,有利于編寫穩(wěn)定、高效且易于維護(hù)的程序代碼。
      #   當(dāng)然,需要注意的是,上述討論主要針對(duì)局部變量。
      #   對(duì)于靜態(tài)變量、全局變量或動(dòng)態(tài)分配的對(duì)象,它們的內(nèi)存地址關(guān)聯(lián)關(guān)系可能存在于數(shù)據(jù)段(Data Segment)或堆區(qū)(Heap),而非棧區(qū)。
      

      【三】字符編碼

      【1】什么是字符編碼

      • 人類在與計(jì)算機(jī)交互時(shí),用的都是人類能讀懂的字符,如中文字符、英文字符、日文字符等
        • 而計(jì)算機(jī)只能識(shí)別二進(jìn)制數(shù)
      • 二進(jìn)制數(shù)即由0和1組成的數(shù)字,例如010010101010
      • 計(jì)算機(jī)是基于電工作的,電的特性即高低電平
      • 人類從邏輯層面將高電平對(duì)應(yīng)為數(shù)字1,低電平對(duì)應(yīng)為數(shù)字0,這直接決定了計(jì)算機(jī)可以識(shí)別的是由0和1組成的數(shù)字
      • 所以,由人類的字符到計(jì)算機(jī)中的數(shù)字,一定經(jīng)歷一個(gè)過程
      • 翻譯的過程必須參照一個(gè)特定的標(biāo)準(zhǔn)
        • 該標(biāo)準(zhǔn)稱之為字符編碼表
        • 該表上存放的就是字符與數(shù)字一一對(duì)應(yīng)的關(guān)系。
      • 字符編碼中的編碼指的是翻譯或者轉(zhuǎn)換的意思
        • 即將人能理解的字符翻譯成計(jì)算機(jī)能識(shí)別的數(shù)字
      # 字符編碼
      # 為什么要學(xué)?
      # 不同國家有不同的文字 ---> 讓python代碼識(shí)別不同國家的文字
      # 我們交流 ---> 我們就指定好指定的模板讓他使用
      

      【2】一家獨(dú)大(ASCII表)

      # 現(xiàn)代計(jì)算機(jī)起源于美國,所以最先考慮僅僅是讓計(jì)算機(jī)識(shí)別英文字符,于是誕生了ASCII表
      # 只有英文字符與數(shù)字的一一對(duì)應(yīng)關(guān)系
      # 一個(gè)英文字符對(duì)應(yīng)1Bytes,1Bytes=8bit,8bit最多包含256個(gè)數(shù)字,可以對(duì)應(yīng)256個(gè)字符,足夠表示所有英文字符
      

      字母對(duì)應(yīng)ASCII表

      • A-Z:65-90
      • a-z:97-122
      • 0-9:48-57
      • 小寫字母對(duì)應(yīng)的數(shù)字一定大于大寫字母

      【3】多方割據(jù)(ASCII/GBK/Shift_JIIS)

      • 為了讓計(jì)算機(jī)能夠識(shí)別中文和英文,中國人定制了 GBK

      [1]GBK表的特點(diǎn)

      • 只有中文字符、英文字符與數(shù)字的一一對(duì)應(yīng)關(guān)系

      • 一個(gè)英文字符對(duì)應(yīng)1Bytes 一個(gè)中文字符對(duì)應(yīng)2Bytes

      • 補(bǔ)充說明

      • 1Bytes=8bit,8bit最多包含256個(gè)數(shù)字,可以對(duì)應(yīng)256個(gè)字符,足夠表示所有英文字符

      • 2Bytes=16bit,16bit最多包含65536個(gè)數(shù)字,可以對(duì)應(yīng)65536個(gè)字符,足夠表示所有中文字符

      [2]各國不同的編碼表

      • 為了讓計(jì)算機(jī)能夠識(shí)別日文字符、英文字符與數(shù)字的一一對(duì)應(yīng)關(guān)系,日本定制了 Shift_JIS
      • 為了讓計(jì)算機(jī)能夠識(shí)別韓文字符、英文字符與數(shù)字的一一對(duì)應(yīng)關(guān)系,韓國定制了 Euc-kr
      • 美國人用的計(jì)算機(jī)里使用字符編碼標(biāo)準(zhǔn)是ASCII
      • 中國人用的計(jì)算機(jī)里使用字符編碼標(biāo)準(zhǔn)是GBK
      • 日本人用的計(jì)算機(jī)里使用字符編碼標(biāo)準(zhǔn)是Shift_JIS

      [3]多種編碼共存的缺點(diǎn)

      • 此時(shí)無論是存還是取由于采用的字符編碼表一樣
        • 所以肯定不會(huì)出現(xiàn)亂碼問題
      • 但問題是
        • 在美國人用的計(jì)算機(jī)里只能輸入英文字符
        • 而在中國人用的計(jì)算機(jī)里只能輸入中文字符和英文字符....
      • 毫無疑問我們希望計(jì)算機(jī)允許我們輸入萬國字符均可識(shí)別、不亂碼,而現(xiàn)階段計(jì)算機(jī)采用的字符編碼ASCII、GBK、Shift_JIS都無法識(shí)別萬國字符
        • 所以我們必須定制一個(gè)兼容萬國字符的編碼表

      【4】統(tǒng)一(unicode)

      • unicode于1990年開始研發(fā),1994年正式公布

      [1]unicode的特點(diǎn)

      • 存在所有語言中的所有字符與數(shù)字的一一對(duì)應(yīng)關(guān)系,即兼容萬國字符
      • 與傳統(tǒng)的字符編碼的二進(jìn)制數(shù)都有對(duì)應(yīng)關(guān)系,詳解如下
        • 很多地方或老的系統(tǒng)、應(yīng)用軟件仍會(huì)采用各種各樣傳統(tǒng)的編碼,這是歷史遺留問題。
        • 此處需要強(qiáng)調(diào):軟件是存放于硬盤的,而運(yùn)行軟件是要將軟件加載到內(nèi)存的,面對(duì)硬盤中存放的各種傳統(tǒng)編碼的軟件,想讓我們的計(jì)算機(jī)能夠?qū)⑺鼈內(nèi)颊_\(yùn)行而不出現(xiàn)亂碼,內(nèi)存中必須有一種兼容萬國的編碼,并且該編碼需要與其他編碼有相對(duì)應(yīng)的映射/轉(zhuǎn)換關(guān)系,這就是unicode的第二大特點(diǎn)產(chǎn)生的緣由

      [2]字符的存儲(chǔ)

      • 文本編輯器輸入任何字符都是最新存在于內(nèi)存中,是unicode編碼的
        • 存放于硬盤中,則可以轉(zhuǎn)換成任意其他編碼,只要該編碼可以支持相應(yīng)的字符
      • 英文字符可以被ASCII識(shí)別
        • 英文字符--->unciode格式的數(shù)字--->ASCII格式的數(shù)字
      • 中文字符、英文字符可以被GBK識(shí)別
        • 中文字符、英文字符--->unicode格式的數(shù)字--->gbk格式的數(shù)字
      • 日文字符、英文字符可以被shift-JIS識(shí)別
        • 日文字符、英文字符--->unicode格式的數(shù)字--->shift-JIS格式的數(shù)字
      # 如果要使用 ---> 讀出來 ---> 展示
      # 美國人--ascii ---> unicode ----> gbk ---> 中文
      # 日本人--shift-jis ---> unicode ----> gbk ---> 中文
      

      【5】如何進(jìn)行編解碼(二進(jìn)制)

      # 【1】解碼 ---> 將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為字符
      # data = b'\xe8\x9a\xa9\xe6\xa2\xa6'
      # print(data.decode('utf-8'))
      # print(data.decode('gbk'))
      # print(data.decode('shift-jis'))
      #
      # name = b'dream'
      # print(type(name))
      
      # # 【2】編碼 ---> 將字符轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)
      # name = '蚩夢(mèng)'
      # # 指定編碼格式 ---> 轉(zhuǎn)換成那種語言的二進(jìn)制四數(shù)據(jù)
      # print(name.encode('utf-8'))
      

      【6】UTF-8的誕生

      • 如果保存到硬盤的是GBK格式二進(jìn)制,當(dāng)初用戶輸入的字符只能是中文或英文

      • 同理如果保存到硬盤的是Shift_JIS格式二進(jìn)制,當(dāng)初用戶輸入的字符只能是日文或英文……

      • 如果我們輸入的字符中包含多國字符,那么該如何處理?

      • 多國字符—√—>內(nèi)存(unicode格式的二進(jìn)制)——X—>硬盤(GBK格式的二進(jìn)制)

      • 多國字符—√—>內(nèi)存(unicode格式的二進(jìn)制)——X—>硬盤(Shift_JIS格式的二進(jìn)制)

      • 多國字符—√—>內(nèi)存(unicode格式的二進(jìn)制)——√—>硬盤(???格式的二進(jìn)制)

      • utf-8是針對(duì)Unicode的可變長度字符編碼:

        • 一個(gè)英文字符占1Bytes,
        • 一個(gè)中文字符占3Bytes,生僻字用更多的Bytes存儲(chǔ)

      【四】文件操作

      【1】操作文件方式一:open語句

      # 1. 打開文件,由應(yīng)用程序向操作系統(tǒng)發(fā)起系統(tǒng)調(diào)用open(...),操作系統(tǒng)打開該文件,對(duì)應(yīng)一塊硬盤空間,并返回一個(gè)文件對(duì)象賦值給一個(gè)變量f
      f = open('a.txt', 'r', encoding='utf-8')  # 默認(rèn)打開模式就為r
      
      # 2. 調(diào)用文件對(duì)象下的讀/寫方法,會(huì)被操作系統(tǒng)轉(zhuǎn)換為讀/寫硬盤的操作
      data = f.read()
      
      # 3. 向操作系統(tǒng)發(fā)起關(guān)閉文件的請(qǐng)求,回收系統(tǒng)資源
      f.close()
      

      【2】操作文件方式二:with open語句

      # 1、在執(zhí)行完子代碼塊后,with 會(huì)自動(dòng)執(zhí)行f.close()
      # open(文件路徑/文件名, 打開模式,編碼方式)
      with open('a.txt', 'w', encoding='utf8') as f:
          pass
      
      # 2、可用用with同時(shí)打開多個(gè)文件,用逗號(hào)分隔開即可
      with open('a.txt', 'r') as read_f, open('b.txt', 'w', encoding='utf8') as write_f:
          data = read_f.read()
          write_f.write(data)
      

      【3】文件的操作模式

      • r(默認(rèn)的):
        • 只讀
      • w:
        • 只寫
      • a:
        • 只追加寫

      [1]r模式的使用

      (1)r只讀模式

      • 在文件不存在時(shí)則報(bào)錯(cuò),文件存在文件內(nèi)指針直接跳到文件開頭
      # 通過 with ... open ... 語句打開文件,并將文件內(nèi)容一次性讀出
      with open('a.txt', mode='r', encoding='utf-8') as f:
          # 會(huì)將文件的內(nèi)容由硬盤全部讀入內(nèi)存,賦值給res
          res = f.read()  
      

      (2)用戶認(rèn)證功能練習(xí)

      # 小練習(xí):實(shí)現(xiàn)用戶認(rèn)證功能
      inp_name = input('請(qǐng)輸入你的名字: ').strip()
      inp_pwd = input('請(qǐng)輸入你的密碼: ').strip()
      with open(r'db.txt', mode='r', encoding='utf-8') as f:
          for line in f:
              # 把用戶輸入的名字與密碼與讀出內(nèi)容做比對(duì)
              u, p = line.strip('\n').split(':')
              if inp_name == u and inp_pwd == p:
                  print('登錄成功')
                  break
          else:
              print('賬號(hào)名或者密碼錯(cuò)誤')
      

      (3)補(bǔ)充

      • 當(dāng)路徑中可能存在有轉(zhuǎn)義的字符時(shí)
        • 或者 \\ 取消 \ 的轉(zhuǎn)義效果
        • 字符串前面加上r來解決轉(zhuǎn)義的問題
      • f:格式化輸出
      • b:將字符串轉(zhuǎn)為二進(jìn)制
      • r:取消 \ 轉(zhuǎn)義
      # 將文件絕對(duì)路徑做成字符串格式時(shí),由于 \ 在Python中是轉(zhuǎn)義符,因此和不用的字符會(huì)產(chǎn)生不同的轉(zhuǎn)義效果
      path = 'E:\PythonProjects\01.py'  # 錯(cuò)誤
      
      # 修正方式一 : \\ 雙轉(zhuǎn)義,將原來的 \ 進(jìn)行反轉(zhuǎn)義
      path = 'E:\\PythonProjects\\01.py'  # \\ 反轉(zhuǎn)義
      
      # 修正方式二 : 在帶 \ 的路徑字符串前 + r 進(jìn)行取消轉(zhuǎn)義
      path = r'E:\PythonProjects\01.py'  # \\ +r 取消轉(zhuǎn)義
      

      [2]w模式的使用

      • w只寫模式: 在文件不存在時(shí)會(huì)創(chuàng)建空文檔,文件存在會(huì)清空文件,文件指針跑到文件開頭
      # 一次性寫入
      data = 'opp|366'
      with open(file='01.text', mode='w', encoding='utf8') as fp:
           # 寫的內(nèi)容
           fp.write(data)
      # 連續(xù)寫入
      with open('b.txt',mode='w',encoding='utf-8') as f:
          f.write('你好\n')
          f.write('我好\n') 
          f.write('大家好\n')
          f.write('111\n222\n333\n')
      

      [3]a模式的應(yīng)用

      • a只追加寫模式: 在文件不存在時(shí)會(huì)創(chuàng)建空文檔,文件存在會(huì)將文件指針直接移動(dòng)到文件末尾
      with open('c.txt',mode='a',encoding='utf-8') as f:
           f.write('44444\n')
           f.write('55555\n')
      
      # 小練習(xí):實(shí)現(xiàn)注冊(cè)功能:
       name=input('username>>>: ').strip()
       pwd=input('password>>>: ').strip()
       with open('db1.txt',mode='a',encoding='utf-8') as f:
           info='%s:%s\n' %(name,pwd)
           f.write(info)
      
      • 強(qiáng)調(diào) w 模式與 a 模式的異同
        • 相同點(diǎn):在打開的文件不關(guān)閉的情況下,連續(xù)的寫入,新寫的內(nèi)容總會(huì)跟在前寫的內(nèi)容之后
        • 不同點(diǎn):以 a 模式重新打開文件,不會(huì)清空原文件內(nèi)容,會(huì)將文件指針直接移動(dòng)到文件末尾,新寫的內(nèi)容永遠(yuǎn)寫在最后

      [4]+模式的應(yīng)用

      • r+ w+ a+ :可讀可寫
      • 在平時(shí)工作中,我們只單純使用r/w/a,要么只讀,要么只寫,一般不用可讀可寫的模式
      # 【一】文件操作模式補(bǔ)充
      # 【1】文本編輯模式
      # w / a / r
      # 完整的模式應(yīng)該是 wt / at rt
      # 大文本編輯模式
      
      # 【2】二進(jìn)制數(shù)據(jù)模式
      # wb / rb
      
      # with open('img.png', 'rb') as fp:
      #     data = fp.read()
      #
      # with open('girl.jpg', 'wb') as fp:
      #     fp.write(data)
      

      【4】文件操作方法

      # 【0】數(shù)據(jù)準(zhǔn)備
      # data = 'dream|521'
      # with open('01.text', 'a', encoding='utf8') as fp:
      #     fp.write(data + '\n')
      # 【1】r模式的方法詳細(xì)
      # with open('01.text', 'r', encoding='utf8') as fp:
      # (1)一次性全部讀完
      # data = fp.read()
      # (2)每次只讀一行
      # count = 0
      # while True:
      #     count += 1
      #     data = fp.readline()
      #     if data:
      #         print(count, data)
      #     else:
      #         break
      # (3)一次性讀很多行 ---> 把所有數(shù)據(jù)讀出來后放到一個(gè)列表中
      # data = fp.readlines()
      # print(data)
      # (4)測(cè)試當(dāng)前對(duì)象是否可讀
      # print(fp.readable())
      # fp = open('01.text', 'r', encoding='utf8')
      # fp.close()
      # print(fp.readable())
      
      # 【2】寫模式的操作方法
      # data_list = ['111', '\n', '222','\n']
      # with open('01.text', 'a', encoding='utf-8') as fp:
      #     # (1)將原本內(nèi)容清空并一次性寫入新內(nèi)容
      #     # fp.write('666')
      #     # (2)逐個(gè)元素進(jìn)行寫入
      #     fp.writelines(data_list)
      
      # with open('01.text', 'w+', encoding='utf-8') as fp:
      #     fp.write('999')
      #     # 將文件寫完后立馬刷新到硬盤中
      #     fp.flush()
      #     data = fp.read()
      #     print(data)
      

      【5】控制文件指針

      # read 方法補(bǔ)充
      # with open('01.text', 'r', encoding='utf8') as fp:
      #     # read 可以放參數(shù),參數(shù)是讀取到哪個(gè)索引位置
      #     data = fp.read(4)
      # print(data)
      
      # seek函數(shù)
      # f.seek(指針移動(dòng)的字節(jié)數(shù),模式控制):
      # 0: 默認(rèn)的模式,該模式代表指針移動(dòng)的字節(jié)數(shù)是以文件開頭為參照的
      # 1: 該模式代表指針移動(dòng)的字節(jié)數(shù)是以當(dāng)前所在的位置為參照的
      # 2: 該模式代表指針移動(dòng)的字節(jié)數(shù)是以文件末尾的位置為參照的
      # with open('girl.jpg', 'rb') as fp:
          # 以開頭作為參照向后移動(dòng)1個(gè)字符
          # 英文字符是占了一個(gè)字符的位置  中文字符是占三個(gè)字符的位置
          # fp.seek(3, 0)
          # 查看當(dāng)前指針?biāo)诘乃饕恢?    # print(fp.tell())  # 3
          # 0 : 以開頭作為參照用一次重置一次
          # fp.seek(3, 0)
          # print(fp.tell())  # 3
      
          # (2)1 模式: 以當(dāng)前位置作為參照向后移動(dòng)
          # 在Python3.x版本之后不允許在文本文件中使用
          # 只能在二進(jìn)制中使用
          # print(fp.read())   # 真是帥爆啦!
          # fp.seek(3, 1)
      
          # (2)2模式:以結(jié)尾位置作為參照移動(dòng)
          # fp.seek(-2, 2)  # \x82'
          # print(fp.tell())
          # print(fp.read())
      

      練習(xí)

      '''
      張一蛋     山東    179    49    12344234523
      李二蛋     河北    163    57    13913453521
      王全蛋     山西    153    62    18651433422
      '''
      
      """
      張一蛋<婦女主任> 179    49    12344234523
      李二蛋     河北    163    57    13913453521
      王全蛋     山西    153    62    18651433422
      """
      
      # 打開文件
      # 打開的模式有一些變化
      # w 會(huì)覆蓋寫
      # a 會(huì)追加在結(jié)尾
      # with open('01.text', 'w+', encoding='utf-8') as fp:
      #     fp.seek(9, 0)
      #     fp.write('<婦女主任>')
      
      # r :讀 rt
      # r+
      # with open('01.text', 'r+', encoding='utf-8') as fp:
      #     fp.seek(9, 0)
      #     fp.write('<婦女主任>')
      #     # 回到開頭讀
      #     fp.seek(0, 0)
      #     data = fp.read()
      # print(data)
      
      '''
      張一蛋     山東    179    49    12344234523
      李二蛋     河北    163    57    13913453521
      王全蛋     山西    153    62    18651433422
      '''
      
      '''
      張一蛋(婦女主任)     山東    179    49    12344234523
      李二蛋(村長)     河北    163    57    13913453521
      王全蛋(書記)     山西    153    62    18651433422
      '''
      
      # line_list = []
      # for line in data:
      #     if '張一蛋' in line:
      #         line = line.replace(line.split()[0], f'{line.split()[0]}(婦女主任)')
      #     elif '李二蛋' in line:
      #         line = line.replace(line.split()[0], f'{line.split()[0]}(村長)')
      #     elif '王全蛋' in line:
      #         line = line.replace(line.split()[0], f'{line.split()[0]}(書記)')
      #     line_list.append(line)
      # print(line_list)
      #
      # with open('01.txt', 'w', encoding='utf-8') as fp:
      #     fp.writelines(line_list)
      
      posted on 2024-04-15 21:34  全宇宙最帥  閱讀(38)  評(píng)論(0)    收藏  舉報(bào)
       
      主站蜘蛛池模板: 日韩精品不卡一区二区三区| 黑人巨大亚洲一区二区久| 九九热在线免费播放视频| 色偷偷亚洲女人天堂观看| 无码中文字幕av免费放| 亚洲成片在线看一区二区| 久久精品国产福利一区二区| 波多野结衣久久一区二区| 久久婷婷五月综合色精品| 国产情侣草莓视频在线| 抚顺县| 日本熟妇色xxxxx| 天天看片视频免费观看| 无码精品国产VA在线观看DVD| 亚洲欧美日韩国产精品专区| 四虎永久在线精品免费看| 天堂av最新版中文在线| 人妻少妇无码精品专区| 玩弄人妻少妇500系列| 四虎精品寂寞少妇在线观看| 91福利视频一区二区| 无码国产精品成人| 亚洲中文字幕人妻系列| 久久碰国产一区二区三区| 国产日产亚洲系列av| 好吊视频在线一区二区三区 | 亚洲欧美高清在线精品一区二区| 久久天天躁狠狠躁夜夜躁| 日韩精品一区二区三区激情| 久久五月丁香合缴情网| 中文字幕在线无码一区二区三区 | 荥阳市| 中文字幕国产精品资源| 男女一级国产片免费视频| 久久精品国产一区二区三| 亚洲精品久荜中文字幕| 亚洲熟妇精品一区二区| 少妇大叫太大太爽受不了| 成人网站国产在线视频内射视频| 亚洲AV无码乱码在线观看性色扶| 中文字幕日韩有码国产|