返回

Day09 -

描述

目錄

文件操作

1.文件的概念
    就是操作系統暴露給用戶操作硬碟的捷徑  
        eg:雙擊一個文件 其實是從硬碟將數據載入到記憶體
         ctrl+s保存文件 其實是將記憶體中的數據刷到硬碟保存
2.代碼打開文件的兩種方式
    方式1:
        f = open(文件路徑,讀寫模式,encoding='utf8')
        f.close()
    方式2:
        with open('a.txt', 'r', encoding='utf8') as f1:
            with子代碼塊
    ps:with上下文管理好處在於子代碼運行結束自動調用close方法關閉資源
"""
open方法的第一個參數是文件路徑 並且撬棍跟一些字母的組合會產生特殊的含義導致路徑查找混亂 為了解決該問題可以在字串的路徑前面加字母r
    D:\a\n\t
    r'D:\a\n\t'
以後涉及到路徑的編寫 推薦加上r

with支持一次性打開多個文件
    with open() as f1,open() as f2,open() as f3:
        子代碼
"""

文件讀寫模式

'r'     只讀模式:只能讀不能寫
     # 1.文件路徑不存在:會直接報錯
    # with open(r'b.txt','r',encoding='utf8') as f:
    #     print(f.read())
    # 2.文件路徑存在:正常讀取文件內容
    with open(r'a.txt', 'r', encoding='utf8') as f:
        print(f.read())
        
'w'     只寫模式:只能寫不能看
    # 1.文件路徑不存在:自動創建
    # with open(r'b.txt', 'w', encoding='utf8') as f:
    #     pass
    # 2.文件路徑存在:先清空文件內容 之後再寫入
    with open(r'a.txt', 'w', encoding='utf8') as f:
        f.write('假期症候群 趕緊要調整\n')
        f.write('假期症候群 趕緊要調整\n')
        f.write('假期症候群 趕緊要調整\n')
    '''強調:換行符需要自己添加 並且在後續數據讀取比對的時候也一定要注意它的存在'''
    
'a'     只追加模式:文件末尾添加數據
    # 1.文件路徑不存在:自動創建
    # with open(r'c.txt', 'a', encoding='utf8') as f:
    #     pass
    # 2.文件路徑存在:自動在末尾等待追加內容
    with open(r'a.txt', 'a', encoding='utf8') as f:
        f.write('放假七天和上班七天感覺是完全不一樣的')
        
"""
當我們在編寫程式碼的時候 有些部分不知道寫什麼具體代碼 但是也不能空著不寫
這個時候可以使用關鍵字
    pass
    ...
只補全語法不執行功能 本身沒有任何的含義
"""

文件操作模式

t   文本模式
    預設的模式 我們上面所寫的r w a其實全稱是 rt wt at
    1.只能操作文本文件
    2.讀寫都是以字元為單位
    3.需要指定encoding參數 如果不知道則會採用計算機預設的編碼
    
b   二進位制模式(bytes模式)
    不是預設的模式 需要自己指定 rb wb ab
    1.可以操作任意類型的文件
    2.讀寫都是以bytes為單位
    3.不需要指定encoding參數 因為它已經是二進位制模式了 不需要編碼
 
二進位制模式與文本模式針對文件路徑是否存在的情況下 規律是一樣的!!!

文件諸多方法

1.read()    
    一次性讀取文件內容 並且游標停留在文件末尾 繼續讀取則沒有內容
    並且當文件內容比較多的時候 該方法還可能會造成計算機記憶體溢出
    括號內還可以填寫數字 在文本模式下 表示讀取幾個字元
2.for循環
    一行行讀取文件內容 避免記憶體溢出現像的產生
3.readline()
    一次只讀一行內容
4.readlines()
    一次性讀取文件內容 會按照行數組織成列表的一個個數據值
5.readable()
    判斷文件是否具備讀數據的能力
6.write()
    寫入數據
7.writeable()
    判斷文件是否具備寫數據的能力
8.writelines()
    接收一個列表 一次性將列表中所有的數據值寫入
9.flush()
    將記憶體中文件數據立刻刷到硬碟 等價於ctrl + s

文件內游標的移動

with open(r'a.txt', 'rb') as f:
    print(f.read())
    f.seek(0,0)
    print(f.read())
    f.seek(0, 0)
    print(f.read())
    # print(f.read(2).decode('utf8'))
    # f.seek(-1, 2)
    # print(f.tell())  # 返回游標距離文件開頭產生的字節數
    """
    seek(offset, whence)
        offset是位移量 以字節為單位
        whence是模式   0  1  2
            0是基於文件開頭
                文本和二進位制模式都可以使用
            1是基於當前位置
                只有二進位制模式可以使用
            2是基於文件末尾
                只有二進位制模式可以使用
    """
    # print(f.read(3).decode('utf8'))

作業

1.編寫簡易版本的拷貝工具
     自己輸入想要拷貝的數據路徑 自己輸入拷貝到哪個地方的目標路徑
     任何類型數據皆可拷貝
     ps:個別電腦C槽文件由於權限問題可能無法拷貝 換其他盤嘗試即可


1.獲取想要拷貝的文件路徑
source_file_path = input('請輸入您想要拷貝的文件路徑>>>:').strip()
2.獲取目標文件的路徑
target_file_path = input('請輸入您想要拷貝到哪個地方的路徑>>>:').strip()
3.打開第一個文件路徑 讀取內容寫入第二個文件路徑中
with open(r'%s' % source_file_path, 'rb') as read_f, open(r'%s' % target_file_path, 'wb') as write_f:
    for line in read_f:
        write_f.write(line)
        
2.利用文件充當資料庫編寫用戶登錄註冊功能
  檔案名稱:userinfo.txt
  基礎要求:
         用戶註冊功能>>>:文件內添加用戶數據(使用者名稱密碼等)
       用戶登錄功能>>>:讀取文件內用戶數據做校驗
      ps:上述功能只需要實現一次就算過關(單用戶) 文件內始終就一個用戶資訊
  拔高要求:
       用戶可以連續註冊
      用戶可以多帳號切換登入(多用戶)  文件內有多個用戶資訊
      ps:思考多用戶數據情況下如何組織文件內數據結構較為簡單
    提示:本質其實就是昨天作業的第二道題 只不過資料庫由數據類型變成文件


while True:
    print("""
    1.註冊功能
    2.登錄功能
    """)
    choice = input('請選擇您想要執行的功能編號>>>:').strip()
    if choice == '1':
        username = input('please input your username>>>:').strip()
        password = input('please input your password>>>:').strip()
        # 2.校驗使用者名稱是否已存在
        with open(r'userinfo.txt', 'r', encoding='utf8') as f:
            for line in f:  # 'jason|123'
                real_name, real_pwd = line.split('|')
                if username == real_name:
                    print('使用者名稱已存在 無法完成註冊')
                    break  # 一旦重複 沒有必要繼續往下校驗是否重複了 直接結束循環
            else:
                with open(r'userinfo.txt', 'a', encoding='utf8') as f1:
                    f1.write(f'{username}|{password}\n')
                print(f'用戶{username}註冊成功')
    elif choice == '2':
        # 1.獲取使用者名稱和密碼
        username = input('please input your username>>>:').strip()  # 'jason'
        password = input('please input your password>>>:').strip()  # '123'
        # 2.打開文件讀取內容並校驗
        with open(r'userinfo.txt', 'r', encoding='utf8') as f:
            for line in f:  # 'jason|123\n'
                real_name, real_pwd = line.split('|')  # 'jason' '123\n'
                if real_name == username and real_pwd.strip('\n') == password:
                    print('登錄成功')
                    break
            else:
                print('使用者名稱或密碼錯誤')
    else:
        print('沒有該功能編號')
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
使用 Hugo 建立
主題 StackJimmy 設計
發表了128篇文章 · 總計63.96k字
本站已運行
·