編碼的進階,檔案操作,深淺copy

想吃橙子發表於2019-03-09

編碼的進階

不同編碼之間的010101是不能相互識別的

網路傳輸,資料儲存到磁碟 使用的010101這種二進位制,不能使用Unicode編碼本去編譯   佔用位元組數太多 佔空間 佔流量

大背景:python3x版本

str:它在記憶體中的編碼方式:Unicode

但寫入檔案的內容 傳輸別人的資料 一般都是str   

矛盾: 傳輸 儲存不能用Unicode  但python3x又要用str操作

所以利用str傳送或傳輸時  ...程式碼... (轉換 將Unicode便把轉為非Unicode)

bytes: 一種資料型別 與str幾乎一模一樣  表現形式  str:'taibai'    bytes:b'taibai'

與str差別: str在記憶體中的編碼:Unicode   bytes編碼是非Unicode

                    中文:str 表現形式為'中國'

                             bytes  : b'\xe4\xb8\xad\xe5\x96\xbq

str ---> utf-8 bytes

s1 = '太白'

b1 = s1.encode('utf-8')

print(b1)

終極轉換

GB 2312                                 UTF-16

 

                      Unicode

 

utf-8                                        gbk

utf-8轉化為gbk

s2 = s1.decode('utf-8')  轉為Unicode    再轉為 s2.encode('gbk')

檔案操作的初識

想開啟一個檔案需要三要素:

檔案路徑:path

編碼方式:utf-8 gbk 等

具體的操作:讀 寫 讀寫 寫讀等

f = .open('路徑格式',encoding='編碼方式',mode='操作')

print(f.read())

f.close()

開啟檔案第二種辦法:

with open('檔案路徑',encoding='編碼型別',mode='操作型別')as f1

好處是省去了寫f.close()

缺點是如果同時操作兩個控制程式碼,可能會因為第一個沒來得及關閉就去操作下一個,導致第一個沒有close,會報錯

f 是變數 是檔案控制程式碼

open()是python的內建函式

Windows:預設編碼 gbk                                           Linux ms:預設編碼utf-8

操作檔案流程:

1.開啟檔案,產生一個檔案控制程式碼

2.對檔案控制程式碼進行相應的操作

3.關閉檔案控制程式碼

可能出現的問題:

路徑問題

\與後面內容構成命令   多加一個\

編碼問題

編碼要與檔案儲存時的編碼保持一致

錯誤

有的電腦會隱藏檔案字尾名   可設定顯示字尾名

檔案的讀

有四種模式 r  r+  rb  r+b

四種模式下,還有五種讀檔案的不同方式

r    在同一個資料夾下,是相對路徑 可以直接寫檔名而不用寫路徑

f1 = open('檔案路徑',encoding='編碼方式')  如果進行讀的操作,就不用加mode操作方式

print(fi.read())

f1.close()    全部讀取,讀取出來的資料型別是str

在r模式中 n代表字元

f1 = open('檔案路徑',encoding='編碼方式') 

print(f1.read(3))

f1.close()    按字元讀取

print(f1.readline())    按行讀取,寫幾行這個程式碼,就讀取幾行

print(f1.readlines())    會返回給出一個列表 列表的每一個元素就是原檔案的每一行

以上四種操作只能操作小檔案  大檔案全部讀取的話會佔用記憶體,導致計算機崩潰

迴圈讀取:

f1 = open('檔案路徑',encoding='編碼方式') 

for line in f1:

    print(line)

f1.close()    每次只輸出一行  輸出一行之後取輸出下一行 不佔用記憶體

rb

以位元組的形式讀取  帶b的一般操作的都是非文字類的檔案(圖片,視訊等)

f1 = open('檔案路徑',encoding='編碼方式',mode='rb') 

print(f1.read())

f.close()         獲得檔案位元組 

檔案的寫

分為w w+ wb w+b

只有一種模式:全部寫入

f1 = open('檔案路徑',encoding='編碼方式',mode='w') 

f.write('寫內容')

f.close()   如果沒有檔案 就建立一個檔案 並寫入內容

f1 = open('檔案路徑',encoding='編碼方式',mode='w') 

f.write('新內容')

f,close()    如果有檔案,先清空,後寫入 檔案沒有close的時候,write多少就寫入多少

wb

f1 = open('檔案路徑',encoding='編碼方式',mode='rb') 

content=f1.read()           把圖片讀取出來

f1.close()

f2 = open('新檔案路徑',encoding='編碼方式',mode='wb') 

f2.write(content)           建立一個新檔案,將原檔案程式碼寫入

f2.close()

檔案的追加

共有四種 a ab a+ a+b

f = open('檔案路徑',encoding='編碼方式',mode='a') 

f.write('內容')         沒有檔案 建立檔案 寫入內容     有檔案 追加內容至末尾

f.close()

r+ 讀寫  先讀後寫

f1 = open('檔案路徑',encoding='編碼方式',mode='r+') 

content=f1.read()

print(content)

f1.write('666')

f1.close()

其他操作

readable  判斷檔案是否可讀

writable   判斷檔案是否可寫

游標預設位置在檔案最開始

f1 = open('檔案路徑',encoding='編碼方式) 

f1.seek(int)    按照位元組調整游標位置

print(f1.tell(1))        獲取游標位置

f1.close()

truncate  對原檔案進行擷取 ,必須在可寫狀態下使用  游標調整對他無用 只能從頭開始  操作方式必須是r+

檔案的改

1.以讀的方式開啟原檔案

2.以寫的方式建立一個新檔案

3.將原檔案的內容讀取出來 按照你的要求改成新內容 寫入新檔案

4.刪除原檔案

5.將新檔案重新命名為原檔案

import os                   輔助模組 幫助刪除

1.2步  

with open('檔案路徑',encoding='編碼方式)as f1,\

    open('檔案路徑',encoding='編碼方式',mode='w')as f2:

3

    old_content=f1.read()

    new_content= old_content.replace('舊','新') 

    f2.write(new_content)

4

    os.remove('原檔案')

5

    os.rename('新檔案','原檔案')

這種方式read全部讀取 佔用記憶體太大 因此可以分行讀取處理

with open('檔案路徑',encoding='編碼方式)as f1,\

    open('檔案路徑',encoding='編碼方式',mode='w')as f2:

for old_line in f1:

    new_line=old_line.replace('舊','新') 

    f2.write(new_line)

    os.remove('原檔案')

    os.rename('新檔案','原檔案')

深淺copy

淺copy

以列表舉例  dict set 也可以copy

copy  複製  但不能完全複製

l1 = [1,2,3,[1,2]]

l2=l1.copy()

只是copy了一個外殼  相當於開闢一個新空間裝列表 但沒有內容 內容用的還是l1  共用一個

給l1新增一個元素 l2不變  但給l1【-1】新增一個元素 l2也跟著新增一個元素

l1 l2  id不同  但包含的內容的id相同  無論在不在一個程式碼塊  都是共用一個

深copy  import copy

l1 = [1,2,3,[1,2]]

l2=l1.copy()

l1[0]  l2[0]   id相同

l1[-1] l2[-1]   id不同

不可變的資料型別共用一份  可變的資料型別l2重新建立一份

深copy不僅複製建立一個新外殼,外殼裡面可變資料型別也建立一份新的 但不可變得資料型別就共用一個

 

相關文章