1. 程式人生 > 其它 >字元編碼的應用與檔案操作

字元編碼的應用與檔案操作

目錄

字元編碼的實際應用

編碼與解碼

s1 = '仰天大笑出門去'
#編碼
將人類能夠看懂的字元 編碼成計算機能夠直接看懂的字元
print(s1.encode('gbk'))
>>>:b'\xd1\xf6\xcc\xec\xb4\xf3\xd0\xa6\xb3\xf6\xc3\xc5\xc8\xa5'
    '''
    字串前面如果加了字母b表明該資料型別為bytes型別可以看成二進位制
    '''
#解碼
將計算機能夠直接讀懂的字元解碼成人類能夠讀懂字元
res = s1.encode('gbk')
print(res.decode('gbk'))
>>>:仰天大笑出門去
print(res.decode('utf8'))  # 報錯
# utf-8用三個十六進位制來表示一箇中文字元,gbk用二個十六進位制來表示一箇中文字元。
'''
基於網路傳輸資料 資料都必須時二進位制格式,所有肯定涉及編碼與解碼
'''

# 亂碼
編碼與解碼型別不同,會出現亂碼
所以用什麼進行變麼就用什麼進行解碼,便不會出現亂碼

#python直譯器
python直譯器預設使用的時ASCII碼,因此在python中出現中文會報錯。
#解決辦法
1.新增檔案頭:coding:utf8或者   _*_ coding:utf8 _*_
2.在使用python2直譯器環境下定義字串,會在前面加上u
eg: s = u'仰天大笑'
    而在python中,預設編碼為utf8

檔案操作

檔案操作簡介

#什麼時檔案
檔案是作業系統為我們提供的操作儲存空間的快捷方式
#程式碼操作檔案的流程
1.開啟檔案、建立檔案
2.編輯檔案內容
3.儲存檔案內容
4.關閉檔案

#基本語法結構
結構1:
	f1 = open()
    f1.close()
結構2:
	with open() as f:
        pass
# 1.使用關鍵字開啟資料夾
open(r'a.txt')  #相對路徑
open(r'D:\py\文件\a.txt')  #絕對路徑
'''在路徑前面加上r是為了防止特殊符號導致路徑出錯'''
res = open(r'a.txt','r', encoding = 'utf8') 
'''
open(檔案路徑,檔案操作模式,檔案的編碼)
1.檔案的路徑是必須的
2.檔案的操作模式和檔案的編碼可以不寫,預設為rt和utf8
'''
res.read() #只讀不寫
res.write()  #只寫不讀
'''
open檔案操作完之後要使用close關閉檔案,但是經常會被遺忘
'''
# with上下文管理
with open(r'a.txt', 'r', encoding = 'uftf8') as f:
    pass
使用withopen 當執行完子程式碼後自動關閉檔案

檔案的讀寫模式

r read  只讀模式
w write  只寫模式
a append  只追加模式
# r模式
#當使用r模式時,如果檔案不不存在將會直接報錯
with open(r'a.txt', 'r', encoding = 'utf8') as f:
    pass 
 pass沒有任何功能,只是讓程式碼不報錯,與 ... 功能一致,通常使用pass

路徑存在,正常開啟檔案並等待內容讀取
with open(r'a.txt', 'r', encoding = 'utf8') as f:
    print(f.read())  #一次性讀取檔案中的所有內容
    f.write('hello word')  #報錯

    
# w模式
#使用w模式,檔案不存在,將會自動一個檔案  檔案存在則清空檔案內容
with open(r'a.txt', 'w', encoding = 'utf8') as f:
    f.write('hello 1\n')  #將內容寫入檔案
    f.write('hello 2\r')  #將內容寫入檔案 
    f.write('hello 3\r')  #將內容寫入檔案
    '''
    \n  \r  都是換行符號
    最早時,\r\n表示換行
    '''
# a模式
#路徑不存在,自動建立檔案,路徑存在並不會清空檔案
with open(r'a.txt', 'a', encoding = 'utf8') as f:
    f.write('hello world')  #將hello world 寫入檔案 
    print(f.read())  #報錯,不能讀

檔案的操作模式

# t模式
文字模式 是預設模式
	r rt
	w wt
	a at
1.只能操作文字檔案
2.必須指定encoding引數
3.讀寫都是以字串為最小單位
# b模式
二進位制模式,可以操作任意型別檔案
rb,wb,ab,,,b不能省略
1.可以操作任意型別檔案
2.不需要指指定encoding引數
3.讀寫都是以bytes為最小單位

檔案內建放到

read() #一次性讀取所有檔案內容
	1.執行完之後游標在檔案末尾,當再次讀取時,沒有內容
	2.當檔案內容過大時,容易造成記憶體溢位
readline()  #一次只讀取一行內容
readlines() #結果為一個列表,一行的內容,對應列表中的一個元素
readable() #判斷是否可讀
write() #寫入檔案內容(字串、bytes型別都可以)
writelines() #將列表中的多個元素寫入檔案
writeable()  #判斷檔案是否可寫
flush() #儲存檔案

檔案拷貝

點選展開

path1 = input(r'請輸入檔案路徑>>>:')
path2 = input(r'請輸入複製後文件路徑>>>:')
with open(rf'{path1}', 'r', encoding='utf8') as f:
    res = f.read()
with open(f'{path2}', 'w', encoding='utf8') as f1:
    f1.write(res)

使用者登入

點選展開

while True:
    # 列印選單介面
    print('**********選單**********\n1.登入\n2.註冊')
    # 獲取使用者選項
    choice = input('請進行功能選擇>>>:').strip()
    if choice == '1':
        username = input('請輸入使用者名稱>>>:').strip()
        userpwd = input('請輸入密碼>>>:').strip()
        with open('userinfo.txt', 'r', encoding='utf8') as f:
            for i in f:
                if i.split('|')[0] == username and i.split('|')[1] == userpwd:
                    print('登入成功')
                else:
                    print('使用者名稱或密碼錯誤')
    if choice == '2':
        while True:
            account = input('請輸入你要註冊的賬號:>>>').strip()
            pwd1 = input('請輸入設定的密碼>>>:').strip()
            pwd2 = input('請再次輸入設定的密碼>>>:').strip()
            if pwd1 == pwd2:
                break
            else:
                print('您兩次輸入的密碼不一樣')
        with open('userinfo.txt','r', encoding='utf8') as f1:
            for info in f1:
                if account in info:
                    print('使用者名稱已存在')
            else:
                with open('userinfo.txt', 'a', encoding='utf8') as f2:
                    f2.write(f'{account}|{pwd1}')