基礎【八】編碼進階及文件操做

py_編碼進階及文件操做

 

編碼進階

 

"""
Python3中有兩種數據類型(注意是數據類型而不是編碼方式):str和bytes。str類型存儲unicode數據,用於向人展現數據,既咱們所說的明文。bytes類型用於存儲字節數據,用於計算機存儲和傳輸
"""
# s1 = '中國'
# str類型用於向人類展現,計算機不認識,想要存儲和網絡傳輸必須先將str轉化成bytes類型;
# s2 = s1.encode('utf-8') # utf-8中轉化成bytes類型,一箇中文==3bytes;
# print(s2)

# 用什麼編碼的就用什麼解碼
# s3 = s2.decode('utf-8')
# print(s3)
# 同理GBK編碼也是
# ------------------------
# gbk與utf-8的轉換
# utf-8<---->unicode<---->gbk
s1 = '中國'
# 首先將字符串編碼成bytes類型才能傳輸
a = s1.encode('utf-8') # 發送bytes類型
# 接收者首先須要將a解碼成unicode編碼(萬國碼)
a1 = a.decode('utf-8')
# 在編碼成gbk格式用於存儲
a2 = s1.encode('gbk')
# 解碼gbk查看
a3 = a2.decode('gbk')
print(a3)
複製代碼
編碼進階:
# str -----> utf-8 bytes
a = '中國'
b = a.encode('utf-8')
print(b)   # b'\xe4\xb8\xad\xe5\x9b\xbd'
# str -----> gbk bytes
c = a.encode('gbk')
print(c)   # b'\xd6\xd0\xb9\xfa'

# utf-8 bytes ------> str  uniconde
demo = b'\xe4\xb8\xad\xe5\x9b\xbd'
str_l = demo.decode('utf-8')
print(str_l)

# gbk bytes ------> str  uniconde
demo1 = b'\xd6\xd0\xb9\xfa'
str_2 = demo1.decode('gbk')
print(str_2)

# 終極轉換  utf-8 ------> gbk  二者之間的轉換必須經過萬國碼(unicode)
t = b'\xe4\xb8\xad\xe5\x9b\xbd'
# 先將utf-8編碼轉換成unicode
y = t.decode('utf-8')
# 在將y編碼成gbk
u= y.encode('gbk')
print(u)
複製代碼

文件操做

文件操做:
#1. 打開文件的模式有(默認爲文本模式):
r ,只讀模式【默認模式,文件必須存在,不存在則拋出異常】
w,只寫模式【不可讀;不存在則建立;存在則清空內容】
a, 只追加寫模式【不可讀;不存在則建立;存在則只追加內容】

#2. 對於非文本文件,咱們只能使用b模式,"b"表示以字節的方式操做(而全部文件也都是以字節的形式存儲的,使用這種模式無需考慮文本文件的字符編碼、圖片文件的jgp格式、視頻文件的avi格式)
rb
wb
ab
注:以b方式打開時,讀取到的內容是字節類型,寫入時也須要提供字節類型,不能指定編碼

#3,‘+’模式(就是增長了一個功能)
r+, 讀寫【可讀,可寫】
w+,寫讀【可寫,可讀】
a+, 寫讀【可寫,可讀】

#4,以bytes類型操做的讀寫,寫讀,寫讀模式
r+b, 讀寫【可讀,可寫】
w+b,寫讀【可寫,可讀】
a+b, 寫讀【可寫,可讀】

r+ 讀寫模式:先讀後寫
rb 以字節的形式讀取,帶b的通常操做的都是非文字類的文件.
read:讀取所有內容(文件較大時不可用,用for循環讀取)
r模式:read(n)----n表明讀取第幾個字符
rb模式:read(n)---n表明讀取第幾個字節
其他的文件內光標移動都是以字節爲單位的如:seek,tell,truncate
readlien:讀取第一行
readliens:返回一個list 列表的每一個元素是源文件的每一行.
重點:seek光標移動(按字節移動)中文3個字節,英文一個字節,換行(\n)是2個字節;
seek(0,0)把光標移到起始位置
seek(0,1)當前光標所在位置
seek(0,2)把光標移到結束位置
r模式:read(n)----n表明讀取第幾個字符,只有r模式n表明字符,其餘都是按字節讀取


1. seek有三種移動方式0,1,2,其中1和2必須在b模式下進行,但不管哪一種模式,都是以bytes爲單位移動的
2. truncate是截斷文件,因此文件的打開方式必須可寫,可是不能用w或w+等方式打開,由於那樣直接清空文件了,因此truncate要在r+或a或a+等模式下測試效果。
經常使用操做:
def close(self, *args, **kwargs): # real signature unknown
        關閉文件
        pass

    def fileno(self, *args, **kwargs): # real signature unknown
        文件描述符
        pass

    def flush(self, *args, **kwargs): # real signature unknown
        刷新文件內部緩衝區
        pass

    def isatty(self, *args, **kwargs): # real signature unknown
        判斷文件是不是贊成tty設備
        pass

    def read(self, *args, **kwargs): # real signature unknown
        讀取指定字節數據
        pass

    def readable(self, *args, **kwargs): # real signature unknown
        是否可讀
        pass

    def readline(self, *args, **kwargs): # real signature unknown
        僅讀取一行數據
        pass

    def seek(self, *args, **kwargs): # real signature unknown
        指定文件中指針位置
        pass

    def seekable(self, *args, **kwargs): # real signature unknown
        指針是否可操做
        pass

    def tell(self, *args, **kwargs): # real signature unknown
        獲取指針位置
        pass

    def truncate(self, *args, **kwargs): # real signature unknown
        截斷數據,僅保留指定以前數據
        pass

    def writable(self, *args, **kwargs): # real signature unknown
        是否可寫
        pass

    def write(self, *args, **kwargs): # real signature unknown
        寫內容
        pass
複製代碼

 文件的修改

文件的數據是存放於硬盤上的,於是只存在覆蓋、不存在修改這麼一說,咱們平時看到的修改文件,都是模擬出來的效果,具體的說有兩種實現方式:html

方式一:將硬盤存放的該文件的內容所有加載到內存,在內存中是能夠修改的,修改完畢後,再由內存覆蓋到硬盤(word,vim,nodpad++等編輯器)python

import os  # 調用系統模塊

with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
    data=read_f.read() #所有讀入內存,若是文件很大,會很卡
    data=data.replace('alex','SB') #在內存中完成修改

    write_f.write(data) #一次性寫入新文件

os.remove('a.txt')  #刪除原文件
os.rename('.a.txt.swap','a.txt')   #將新建的文件重命名爲原文
方法一

方式二:將硬盤存放的該文件的內容一行一行地讀入內存,修改完畢就寫入新文件,最後用新文件覆蓋源文件vim

import os

with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
    for line in read_f:
        line=line.replace('alex','SB')
        write_f.write(line)

os.remove('a.txt')
os.rename('.a.txt.swap','a.txt') 
方法二

練習:網絡

1. 文件a.txt內容:每一行內容分別爲商品名字,價錢,個數。app

apple 10 3編輯器

tesla 100000 1ide

mac 3000 2post

lenovo 30000 3測試

chicken 10 3編碼

經過代碼,將其構建成這種數據類型:[{'name':'apple','price':10,'amount':3},{'name':'tesla','price':1000000,'amount':1}......] 並計算出總價錢。

2,有以下文件:

-------

alex是老男孩python發起人,建立人。

alex實際上是人妖。

誰說alex是sb?

大家真逗,alex再牛逼,也掩飾不住資深屌絲的氣質。

----------

將文件中全部的alex都替換成大寫的SB。

相關文章
相關標籤/搜索