Python學習之路基礎篇--08Python基礎+ 文件的基本操做和 註冊小做業

1 文件的基本操做python

#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, 寫讀【可寫,可讀】

2 文件的方法vim

read(3):

  1. 文件打開方式爲文本模式時,表明讀取3個字符

  2. 文件打開方式爲b模式時,表明讀取3個字節

其他的文件內光標移動都是以字節爲單位的如:seek,tell,truncate

注意:

  1. seek有三種移動方式0,1,2,其中1和2必須在b模式下進行,但不管哪一種模式,都是以bytes爲單位移動的(如是移動中文的話,在utf-8 中移動,若不是3的倍數,就會報錯)

  2. truncate是截斷文件,因此文件的打開方式必須可寫,可是不能用w或w+等方式打開,由於那樣直接清空文件了,因此truncate要在r+或a或a+等模式下測試效果。(不知道可不能夠調光標)

 

r 讀模式:app

  若在E盤下的能夠把文件的相對路徑寫入以下:(不存在此文件時,會報錯)編輯器

f = open('e:/new.txt',mode = 'r', encoding='utf-8')#編碼用什麼方式編的, 就要用什麼方式打開,在pyCharm 中默認是用utf-8 編寫的
conenct = f.read()
print(conenct)
f.close()
f = open('newt',mode = 'r', encoding='utf-8')#編碼用什麼方式編的, 就要用什麼方式打開,在pyCharm 中默認是用utf-8 編寫的
conenct = f.read()
print(conenct)
f.close()

  這是打開python 文件下目錄下文件, 就不用寫絕對路徑,只須要定相對路徑便可測試

  注意 :在文件操做時必定要記得關閉文件,也就是close編碼

 

rb bytes模式下的讀(非文本類型的時候用)spa

f = open('file1',mode='rb')
conenct = f.read()
print(conenct)#b'\xe6\x88\x91\xe6\x83\xb3\xe7\x9d\xa1\xe8\xa7\x89'
f.close()

  由於是用 bytes 類型打開,因此就不用寫解碼方式,打印的數據是 utf-8 ,由於我寫了四個中文,12個字節code

 

w 寫模式orm

  不存在就建立,存在就全刪在寫視頻

f = open('file1',mode='w',encoding='utf-8')
conenct = f.write('我想睡覺')
print(conenct)#返回值爲其的字符個數,只能寫,覆蓋,不能讀
f.close()

 

wb bytes模式下的寫

f = open('file1',mode='wb')
conenct = f.write('傻不傻'.encode('utf-8'))
print(conenct)#返回的其字節個數 9
f.close()

 

a 追加

  其實和w 差很少, 只是不會刪除,在以後寫上而以(ab 都同樣,和wb 差很少)

 

r+ 讀寫模式(在讀的基礎上加了寫的功能,可是隻有兩個功能, 再讀的話就不行了)這個功能是用的最多的

w+ 與a+

f = open('file1',mode='w+',encoding='utf-8')
f.write('afdf')
f.seek(0)#要移動光標才能讀出來東西
print(f.read(2))
f.close()

 

3 對文件的修改

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

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')   #將新建的文件重命名爲原文件

方法一

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

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') 

方法二

ps: 

  之後打開方式用 with 能夠不用 close

with open('log',mode='r+',encoding='utf-8') as f,open('log',mode='w+',encoding='utf-8') as f1:

  也能夠打開多個文件

 

4 註冊小做業

  一個簡單的註冊登入做業,若是沒有帳號就建立一個新的,有就用原來的帳號登入,

flag = True
while flag:
    i = 0
    while i <3 and flag :
        whether_account = input('是否擁有帳號,若是有請輸入 y,沒有輸入 n(輸入 q 退出):')
        if whether_account.strip() == 'y':
            break
        elif whether_account.strip() =='n':
            username = input('請輸入想要註冊的用戶名:')
            password = input('請輸入密碼:')
            with open(username, mode='w+', encoding='utf-8') as f1:
               f1.write('{}\n{}'.format(username,password))
            break
        elif whether_account.strip() =='q':
            flag =False
        elif i !=2:
            print('請輸入正確字符,你只有{}機會'.format(2-i))
        i +=1
    lis = []
    i = 0
    try:
        while i < 3  and flag:
            user_name = input('請輸入你的帳號:')
            password = input('請輸入你的密碼:')
            with open(user_name, mode='r+', encoding='utf-8') as f2:
                for lin in f2:
                    lis.append(lin.strip())
            if user_name == lis[0] and password == lis[1]:
                print('歡迎登入'.center(51,'~'))
                flag = False
            elif i != 2:
                print(' 你只有 %d 次機會' %(2-i))
            i += 1
    except(FileNotFoundError) as e:
       c
相關文章
相關標籤/搜索