文件操做分爲三個步驟:文件打開、操做文件、關閉文件,可是,咱們能夠用with來管理文件操做,這樣就不須要手動來關閉文件。python
實現原理:程序員
import contextlib @contextlib.contextmanager def show(): print('123') yield print('456') with show(): print('777') print('888') print('999')
操做步驟shell
#windows下默認爲gbk,要指定編碼爲'utf-8' #'r'爲只讀,'test.txt'爲文件路徑 f=open('test.txt','r',encoding='utf-8') #utf-8編碼方式打開文件 data=f.read() #操做文件 f.close() #關閉文件 print(data) # 用with語句打開,不須要手動關閉 with open('test.txt','r',encoding='utf-8') as f: print(f.read())
示例 windows
# r,只讀模式【默認,不存在則報錯】 # w,只寫模式【不可讀:不存在則建立;存在則清空內容】 # x,只寫模式【不可讀:不存在則建立,存在則報錯】 # a,追加模式【不可讀;不存在則建立;存在則只追加內容】 # "+"表示能夠同時讀寫某個文件,好比r+、w+、x+、a+ # "b"表示以字節的方式操做,rb或r+b,wb或w+b,xb或x+b,ab或a+b, # 以b方式打開時,讀取到的內容是字節類型,寫入時也須要提供字節類型,這些都須要程序員來作轉換。 # f.tell() 讀取指針的位置 # f.seek() 設置指針的位置 # r只讀(不存在則報錯) with open('test.txt', 'r', encoding='utf-8') as f: print(f.read()) # test.txt,不存在,報錯 # w只寫(不可讀,不存在建立,存在則清空) with open('test.txt', 'w') as f: f.write('123') # 建立test.txt 寫入新內容123 # x只寫(不可讀,不存在建立,存在報錯) with open('test.txt', 'x') as f: f.write('666') # 這裏存在,報錯 # a追加模式(不可讀,不存在建立,存在往末尾追加) with open('test.txt', 'a') as f: f.write('111') # 往test.txt裏面追加111 # 以字節方式打開,將test.txt裏面的文件內容清空,往裏面寫入'你們好',須要將內容轉換成bytes類型 with open('test.txt', 'wb') as f: str_data = '你們好' byte_data = str_data.encode('utf-8') f.write(byte_data) # 以rb讀 with open('test.txt', 'rb') as f: data = f.read() print(data) # b'\xe5\xa4\xa7\xe5\xae\xb6\xe5\xa5\xbd' print(type(data)) # 打印出讀取的類型<class 'bytes'> str_data = data.decode('utf-8') print(str_data) # 你們好 # r+形式 寫的時候在末尾追加,指針移到到最後 with open('test.txt','r+',encoding='utf-8') as f: print(f.tell()) # 打印下 文件開始時候指針指向哪裏 這裏指向 0 print(f.read()) # 讀出文件內容'你們好' print(f.tell()) # 文件指針指到 9,一個漢子三個字符串,指針是以字符爲單位 f.write('我在學習') # 寫入內容'我在學習',須要特別注意此時文件指針在末尾 print(f.read()) # 指針到末尾去了,因此讀取的內容爲空 print(f.tell()) # 指針指到15 f.seek(0) # 將指針內容指到 0 位置 print(f.read()) # 由於文件指針指到開頭去了,因此能夠讀到內容 你們好我在學習 # w+形式 存在的話先清空 一寫的時候指針到最後 with open('test.txt', 'w+') as f: f.write('python') # test.txt存在,因此將內面的內容清空,而後再寫入 'python' print(f.tell()) # 此時指針指向6 print(f.read()) # 讀不到內容,由於指針指向末尾了 f.seek(0) # 移動指針到開頭 print(f.read()) # 讀到內容 # a+打開的時候指針已經移到最後,寫的時候無論怎樣都往文件末尾追加 with open('test.txt', 'a+') as f: print(f.tell()) f.write(' is best') print(f.read()) # 讀不到內容,由於指針指向末尾了 f.seek(0) # 移動指針到開頭 print(f.read()) # 讀到內容 # x+文件存在的話則報錯 with open('test.txt', 'x+') as f: # FileExistsError: [Errno 17] File exists: 'test.txt' print(f.tell()) f.write(' hello') print(f.read()) f.seek(0) print(f.read())
同時操做多個文件學習
# 拷貝A文件到B文件中 with open('A.txt','r',encoding='utf-8') as fr,open('B.txt','w',encoding='utf-8') as fw: for line in fr: # 一行行的讀 fw.write(line) # 一行行的寫
在python中,編碼是一個比較折騰的難點,特別是python2。優化
首先,瞭解下這幾種編碼:編碼
ASCII(American Standard Code for Information Interchange,美國標準信息交換代碼)是基於拉丁字母的一套電腦編碼系統,主要用於顯示現代英語和其餘西歐語言,其最多隻能用 8 位來表示(一個字節),即:2**8 = 256,因此,ASCII碼最多隻能表示 256 個符號,顯然ASCII碼沒法將世界上的各類文字和符號所有表示,因此,就須要新出一種能夠表明全部字符和符號的編碼,即:Unicodespa
Unicode(統一碼、萬國碼、單一碼)是一種在計算機上使用的字符編碼。Unicode 是爲了解決傳統的字符編碼方案的侷限而產生的,它爲每種語言中的每一個字符設定了統一而且惟一的二進制編碼,規定雖有的字符和符號最少由 16 位來表示(2個字節),即:2 **16 = 65536,注:此處說的的是最少2個字節,可能更多 指針
UTF-8,是對Unicode編碼的壓縮和優化,他再也不使用最少使用2個字節,而是將全部的字符和符號進行分類:ascii碼中的內容用1個字節保存、歐洲的字符用2個字節保存,東亞的字符用3個字節保存...code
在python3中,字符串編碼是unicode,默認文件編碼是utf-8(存在硬盤上的文件),因此能夠省略文件頭編碼聲明:#-*- coding:utf-8 -*-
讀取到內存會被python解釋器自動轉換成unicode
並且,全部的unicode字符編碼後都會變成bytes類型
可是若是是其餘文件編碼,如gbk,則須要聲明文件編碼:#-*- coding:gbk -*-,可是以gbk讀取到內存中後,依然會轉爲unicode
總之,以什麼編碼方式存在硬盤上(代碼字符串文件頭定義的編碼,好比:# -*- coding:utf8 -*-),就用什麼編碼方式從硬盤上讀,無論什麼編碼方式,python3都會將字符串在內存中轉爲unicode
py3自動把文件編碼轉爲unicode一定是調用了什麼方法,這個方法就是,decode(解碼) 和encode(編碼)
UTF-8 --> decode 解碼 --> Unicode
Unicode --> encode 編碼 --> GBK / UTF-8
#-*- coding:utf-8 -*- import sys print(sys.getdefaultencoding()) # utf-8 s = '你好' print(s) # 你好 print(type(s)) # <class 'str'> print(s.encode()) # b'\xe4\xbd\xa0\xe5\xa5\xbd' s_to_gbk = s.encode('gbk') # 編碼成gbk print(s_to_gbk) # b'\xc4\xe3\xba\xc3' print(s_to_gbk.decode('gbk').encode('utf-8')) # gbk轉成utf-8,和上面s.encode()同樣,b'\xe4\xbd\xa0\xe5\xa5\xbd'
1.實現簡單的shell sed替換功能
2.註冊
註冊信息存放在文件中
3.模擬登錄
連續登錄失敗三次,就鎖定用戶