1. 程式人生 > 其它 >字元編碼與檔案處理

字元編碼與檔案處理

作業講解

2.字典練習題
    1.將列表中大於等於66的元素放入字典k1鍵對應的列表中
    	將列表中小於66的元素放入字典k2鍵對應的列表中
        nums=[11,22,33,44,55,66,77,88,99,90]
        dic={
            'k1':[],
            'k2':[]
        }
    2.s='hello jason jason say hello sb sb sb'
		統計字串中每個單詞出現的次數
        	{'jason':2,...}
3.集合練習題
	 一.關係運算
      有如下兩個集合,pythons是報名python課程的學員名字集合,linuxs是報名linux課程的學員名字集合
      pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'}
      linuxs={'wupeiqi','oldboy','gangdan'}
      1. 求出即報名python又報名linux課程的學員名字集合
      2. 求出所有報名的學生名字集合
      3. 求出只報名python課程的學員名字
      4. 求出沒有同時這兩門課程的學員名字集合
      二 去重並且保留原來的順序
    	l = [11,22,33,22,22,33,11,22,55,66,66,77,77]
        1.去重不保留順序
        2.去重並且保留順序

字元編碼

計算機內部儲存資料都是以二進位制數字的形式儲存
	計算機基於電工作 而電訊號只有高低電平兩種狀態
    也就意味著計算機的世界裡只能識別兩種狀態
    我們人為的將高電平定義為數字1
    低電平定義為數字0
   	0	你
    1    我
    
    00	
    01
    10
    11
    
    000
    ...
    
單位換算(重要)
	位元位bit(二進位制數的個數)
    8bit = 1bytes(位元組)
    1024bytes = 1KB
    1024KB = 1MB
    1024MB = 1GB
    1024GB = 1TB
    1024TB = 1PB
   
字元編碼的研究僅限於文字檔案(******)


為什麼我們人類在使用計算機輸入字元的時候電腦展示是人類能夠看懂的字元
而計算機內部只識別01二進位制
	00001010			我
    00001101              你
    計算機二進位制			設定好的對應關係		人類的字元
    
字元編碼表
	規定了人類的字元與數字之間的對應關係

字元編碼發展史

一家獨大
	計算機是由美國人發明的 美國人需要計算機能夠識別英文
    所以發明了ASCII碼(字元編碼表)
    	記錄了英文與數字的對應關係
        	1bytes來表示所有的英文及符號
    			8bit	256
                 # 所有的英文字母及符號加起來其實也不會超過128種可能
群雄割據
	中國
    	中國人為了計算機能夠識別中文發明了GBK碼
        GBK碼錶
        	記錄了中文、英文與數字的對應關係
            	2bytes來表示中文及符號
                	16bit       65535
                1bytes來表示所有的英文及符號
                    # 生僻字可能會使用更多的bytes來表示
        
    日本
    	日本人為了計算機能識別日文發明了shift_JIS碼
        shift_JIS碼錶
        	記錄了日文、英文與數字的對應關係
            1bytes來表示所有的英文及符號
            	
    韓國
		韓國人為了計算機能識別韓文發明了Euc_kr碼
        Euc_kr碼錶
        	記錄了韓文、英文與數字的對應關係
            1bytes來表示所有的英文及符號
天下一統
	群雄割據導致資料互動不通暢(亂碼)
    unicode萬國碼
    	相容萬國字元
        所有的字元同意使用2bytes表示 不夠增加更多bytes
    utf8
    	unicode transformation format
        英文還是用1bytes
        中文改用3bytes
   # 記憶體使用的編碼表是unicode 硬碟使用的是utf8
'''已經你們只需要記住文字檔案編碼統一使用utf8即可'''

字元編碼實操

1.解決檔案亂碼的核心
	檔案以什麼編碼存的就以什麼編碼取
2.編碼與解碼(重要)
	編碼
    	將人類的字元按照指定的編碼轉換成計算機能夠識別的資料
        encode()
    解碼
    	將計算機能否識別的資料按照指定的編碼轉換成人類能夠讀懂的字元
        decode()
3.python直譯器預設編碼
	python2預設的是ASCII碼
    	在python2中定義字串在前面加一個字母u
        檔案頭指定編碼
        	# -*- conding:utf8 -*-
            name = u'jason'
    python3預設的是utf8碼

檔案操作

作業系統
	windows mac linux
雙擊檔案
	硬碟轉 磁頭讀取資料
儲存檔案
	硬碟轉 磁頭寫入資料
 
我們在操作檔案的時候其實操作的是硬碟
'''檔案其實是作業系統暴露給我們可以簡單快捷的操作硬碟的介面'''


絕對路徑與相對路徑
	絕對路徑
    	非常詳細的路徑描述
        	無論什麼人什麼位置都可以找到
    相對路徑
    	有一個參考
        	只有對應的人才可以找到

# res = open(r'a.txt','r',encoding='utf8')
# print(res.read())
# res.close()



# 開啟a.txt 使用變數名f指代改檔案
# with open(r'a.txt','r',encoding='utf8') as f:
#     print(f.read())  # 讀取檔案內容
    # with子程式碼執行結束之後會自動呼叫close關閉檔案資源
# """
# with open(檔案路徑,讀寫模式,編碼格式) as 變數名:
#     子程式碼塊
# 檔案路徑是必須的
# 讀寫模式和編碼格式是可選的
# """


# 如果不指定讀寫模式 那麼預設使用r
# 如果不指定編碼格式 那麼預設使用當前計算機內部預設編碼
"""在中國所有的windows電腦內部預設的編碼是gbk"""
with open(r'a.txt') as f:
    print(f.read())  # 讀取檔案內容


# 取消轉義
# res = r'D:\day08\a.txt'
# res1 = r'D:\day08\n.txt'
# res2 = r'D:\day08\t.txt'
# print(res,res1,res2)

檔案處理

"""
1、什麼是檔案
    檔案是作業系統提供給使用者或者說應用程式操作硬碟的一種功能

2、為何要用檔案
    讀寫檔案就是在讀寫硬碟:我們對檔案的讀寫操作都會被作業系統轉換成硬碟的讀寫操作

    應用程式-------------》檔案物件、檔案控制代碼
    作業系統-------------》檔案
    硬體-----------------》硬碟

"""

基本格式

f = open(r'a.txt',mode='rt',encoding='utf-8')
print(f.read())
f.close

with open(r'a.txt',mode='rt',encoding='utf-8') as f:
    print(f.read())

檔案開啟模式

1.控制檔案讀寫操作的模式
r   預設   讀
w         清除之後寫
a          追加,寫
r 模式 :

只讀模式,如果檔案不存在則報錯,存在則檔案指標處於檔案開頭

f = open('a.txt',mode='rt',encoding='utf-8')
print(f.read())       讀取檔案
print(f.readable())   檢視能否讀     True
print(f.writable())  檢視能否寫      False

f.close()        # 以這種模式末尾不要忘記加close關閉檔案
w模式:

只寫模式,如果檔案不存在則建立空文件,檔案存在則清空,檔案指標處於檔案開頭

f = open('a.txt',mode='wt',encoding='utf-8')
f.write('1111\n')     向檔案寫文件   \n 換行
print(readable())    
print(writable())     
f.close()
#總結:W模式,在開啟檔案不關的情況下,連續的write寫入,新寫的內容永遠跟在後面
a模式:

只追加寫模式,如果檔案不存在則建立空文件,檔案存在不會清空,檔案指標處於檔案末尾

f = open('a.txt',mode='at',encoding='utf-8')
f.write('222\n')
print(readable())    
print(writable())    
f.close()
# 總結:a模式,在打開了檔案不關的情況下,連續的write寫入,新寫的內容永遠跟在後面,這一點與w模式相同
#  不同的是,在打開了檔案關閉然後重新開啟的情況下,a模式永遠寫在後面
2.控制檔案內容的模式
t   預設   讀寫都是以字串為單位的,只適用於文字檔案,必須指定encoding引數
b    讀寫都是以bytes為單位,適用於所有檔案,不能指定encoding引數
b模式:

讀寫都是以bytes為單位的,適用於所有檔案,一定不能指定encoding引數

with open(r'a.txt',mode='rb') as f:
    res = f.read()
    print(res.decode('utf-8'))       decode  解碼

 with open('a.txt',mode='ab') as f:
     f.write("啊手動閥手動閥".encode('utf-8'))    encode  編碼
可讀可寫
r+t
w+t
a+t

r+b
w+b
a+b

with open('a.txt','r+t',encoding='utf-8') as f:
    print(f.readable())
    print(f.writable())
檔案操作其他方法
# with open('a.txt',mode='rt',encoding='utf-8') as f:
#     line = f.readline()
#     line = f.readlines()
#     print(line)          #  print(lines)
#     print(f.readline())
#     print(f.readlines())
# readline  只讀一行
# readlines  每個資料以字串形式輸出,放在列表中
 with open('a.txt',mode='wt',encoding='utf-8') as f:
#     f.write("111\n222\n333\n")
#     lines = ['111\n','222\n','3333\n']
#     for line in lines:
#         f.write(line)
#     f.writelines(lines)
#     f.write('hello')
#     f.flush()                    重新整理
#     f.writelines('hello')
控制檔案指標移動
 with open('a.txt',mode='rt',encoding='utf-8') as f:
#     res = f.read(6)
#     print(res)

# with open('a.txt',mode='rb') as f:
#     res1 = f.read(8)
#     print(res1.decode('utf-8'))

# f.truncate()    截斷
# with open('a.txt',mode='r+t',encoding='utf-8') as f:
#     f.truncate(8)

. seek有三種移動方式0,1,2,其中1和2必須在b模式下進行,但無論哪種模式,都是以bytes為單位移動的
# f.seek移動的全都是位元組個數
# f.seek(位元組個數,0)  
# f.seek(位元組個數,1)
# f.seek(位元組個數,2)