今天是Python基礎數據類型的最後一課,今天主要學習的知識是文件。文件主要分為讀文件,寫文件,讀寫文件,寫讀文件..... 首先我們來說只讀文件 我們先看下絕對路徑下的讀文件: open(1,2,3):打開文件,open()裡面的第一個參數是路徑的意思,你存儲的文件絕對路徑,裡面第二個參數是模式, ...
今天是Python基礎數據類型的最後一課,今天主要學習的知識是文件。文件主要分為讀文件,寫文件,讀寫文件,寫讀文件.....
首先我們來說只讀文件
#1,只讀文件(‘絕對路徑’) f1 = open('d:\a.txt',mode='r',encoding='utf-8') content = f1.read() print(content) f1.close()
我們先看下絕對路徑下的讀文件:
open(1,2,3):打開文件,open()裡面的第一個參數是路徑的意思,你存儲的文件絕對路徑,裡面第二個參數是模式,‘r’在這裡的意思是只讀模式,裡面的
第三個參數encoding()是編碼方式,一般預設的都是 utf-8 ,因為python文件傳輸存儲的編碼格式都是 utf -8。
close() : 關閉文件,我們在最後都要加上close(),如果不加,程式會一直執行,占用記憶體空間
read() : 只讀,讀取文件的內容
我們在看下相對路徑下的讀文件
f1 = open('a',mode='r',encoding='utf-8') content = f1.read() print(content) f1.close()
我們不難看出相對路徑和絕對路徑的代碼基本上來說是差不多的,有差別的只是open()的一個參數,路徑,路徑被換成了相對路徑。在做程式時,我們使用的相對路徑的頻率遠遠高於絕對路徑。所以我們以後預設使用相對路徑,也希望大家以後也使用相對路徑,少用或不用絕對路徑,因為絕對路徑一旦改變文件的位置,會找不到,會導致我們的程式報錯。、
說完了只讀文件,下麵來說只寫文件(寫文件我們也可以稱創建文件):
#只寫文件 f1 = open('a',mode='w',encoding='utf-8') f1.write(' hello python ') f1.close()
相對於只讀文件,我們來對比的來看只寫文件,有差別的時open()的第二個參數,mode 由以前的 ‘r’ 換成了 ‘w’. 我們可以看下,執行完此程式的源文件
hello python
對於只寫文件,我們要來講述一個知識點,open()的一個參數,路徑。由於是寫文件,所以存在文件的是否存在,如果文件不存在,就好說了,我們直接執行write(),把咱們要寫的文件直接添加的路徑下的文件就可以了,那麼如果我們要寫的文件之前就存在了呢,並且之前由數據了呢?我們怎麼辦。我們來看下如下代碼:
a = open('1',mode='w',encoding='utf-8') a.write('hello') #hello a.close() b = open('1',mode='w',encoding='utf-8') b.write('hi') b.close() #hi
我們不難發現當我們往 1 這個文件里存儲 ‘hello’ 以後,我們再存儲‘hi’,源文件只剩 ‘hi’ 這個字元里,所以我們得出:對於寫,沒有此文件就會創建文件,如果有文件,就會把源文件內容刪除,再寫新的內容(覆蓋)。
講述了只讀文件和只寫文件,我們對文件有了一些大概的瞭解,下麵我們來說bytes類型的只讀和只寫文件。下麵來看下代碼:
只寫文件:
a = open('1',mode='wb') a.write('hello'.encode('utf-8')) #hello a.close()
只讀文件:
a = open('1',mode='rb')
content = a.read()
print(content)
a.close()
下麵我首先來說下bytes類型,bytes類型是以 utf-8 的編碼方式編碼的一種類型,那麼我們為什麼用bytes ? 我們在剛纔學習的只讀和只寫,只能讀取和寫入一些文本信息,在我們的生活中,肯定不可能都只是文本,應該也會大量瀏覽圖片或者音頻等其他的方式,那麼bytes的作用就來了,它是用於非文字類的文件上傳和下載時使用。
首先說下bytes類型的只讀文件,首先open()第三個三個參數被取消了,不再用編碼(encoding),它是以什麼方式存儲,就打開什麼方式。
最後我們說下read(),我們知道,content的數據類型讀取的是bytes類型,但是列印出來content卻是str, 那麼問題來了,(因為str採用的是Unicode的編碼方式,而我們上傳下載和存儲的bytes編碼方式是utf-8,但是卻列印出來了字元串,) 這是為什麼呢?
是read() , 隱藏了 bytes -> str
下麵說下bytes類型的只寫文件,同樣open()第三個三個參數被取消了,不再用編碼(encoding),但是相對於之前的只寫文件卻出現了一些差異,我們在write()裡面進行了編碼的轉化,eg.
a.write('hello'.encode('utf-8'))
很多人會問了,為什麼這段代碼什麼意思?為什麼這樣寫呢?
其實還是那個意思,'hello',眾所周知,它是str類型,str是什麼編碼方式?Unicode吧,但是在python中,上傳下載不允許直接使用Unicode,預設支持的是‘utf-8’,同時encode()使str的方法,所以在這個位置進行修改編碼方式
講完了只寫文件,很多人就會問博主了,我們寫入只能覆蓋,可是這樣始終只能存一個值啊,我們能不能存多份值呢,有什麼方法嗎?比如說我們列表的append()方法.......,其實我們文件也是有追加的:
#追加: a = open('1',mode='a',encoding='utf-8') a.write('hello') a.close() #bytes類型: a = open('1',mode='ab') a.write('xiaoming'.encode('utf-8')) a.close()
相對於只寫的代碼,我們可以看出,mode = 'a' ,它有以前的‘w’變成了‘a’,當然功能也隨之改變,它是追加的意思,相當於列表的append()方法。(在之後我們就不具體說明bytes類型了,因為意思和之前所描述的只讀和只寫差不多,所以在之後就不進行過多的描述了。)
那麼我們很多人就會有疑問了,問什麼‘a’能添加而‘w’卻只能覆蓋呢?在這裡先大概說下,是游標的原因。
r :游標在字元的最後面
w :游標在字元的最前面
a :游標移動到有文字的最後一位
文件的讀寫:(只能進行一次讀寫)
# f = open('log',mode='r+',encoding='utf-8') # print(f.read()) # f.close()
# f = open('log',mode='r+b') # print(f.read()) # f.write('大猛,小孟'.encode('utf-8')) # f.close()
文件的寫讀:
# f = open('log',mode='w+',encoding='utf-8') # f.write('aaa') # f.seek(0) # print(f.read()) # f.close()
文件的追加寫讀:
# f = open('log',mode='a+',encoding='utf-8') # f.write('佳琪') # f.seek(0) # print(f.read()) # f.close()
下麵來介紹文件的方法:
# obj = open('log',mode='r+',encoding='utf-8') # content = f.read(3) # 讀出來的都是字元 # f.seek(3) # 是按照位元組定游標的位置 # f.tell() 告訴你游標的位置 # print(f.tell()) # content = f.read() # print(content) # f.tell() # f.readable() # 是否刻度 # line = f.readline() # 一行一行的讀 # line = f.readlines() # 每一行當成列表中的一個元素,添加到list中 # f.truncate(4) # for line in f: # print(line) # f.close()
在文件中,open()我們還有另外一種寫法,比較常用,以後我們大多用這個寫法:
# with open('log',mode='r+',encoding='utf-8') as f,\ # open('log',mode='w+',encoding='utf-8') as f1:
這個寫法是不用寫close()的。
最後我介紹下斷點續傳的問題:
1.先知道游標的位置 -> tell()
2.將游標調製到特定的位置 -> seek(tell())
最後留一個小題:
通過文件實現,之前做過的三次驗證用戶登陸:
#方法一: print('請先註冊用戶信息') username = input('please input the username :') password = input('please input the password :') f1 = open('message',mode='w+',encoding='utf-8') f1.write(username) f1.seek(0) f2 = open('password',mode='w+',encoding='utf-8') f2.write(password) f2.seek(0) print('您準備註冊還是登陸,如果登陸請輸入G , 如果想繼續註冊輸入 I ,如果退出請輸入 E') s1 = input('<<<') if s1.upper() == 'G': i = 3 while i > 0: user = input('please input the username :') word = input('please input the password :') if f1.read() == user and f2.read() == word: print('welcome to enter , loading......') break elif f1.read() != user or f2.read() != word: i -= 1 print('Fuck off ,please input continue , you have ' + str(i) + ' times') continue elif s1 .upper() == 'I': username = input('please input the username :') password = input('please input the password :') f1 = open('message', mode='w+', encoding='utf-8') f1.write(username) f1.seek(0) f2 = open('password', mode='w+', encoding='utf-8') f2.write(password) f2.seek(0) else: exit('exiting....') f1.close() f2.close() #方法二 username = input('please input the username :') password = input('please input the password :') with open('mess',mode='w+',encoding='utf-8') as f: f.write('{}\n{}'.format(username,password)) print('恭喜你註冊成功!') i = 0 a = [] while i < 3: user = input('please input the username :') pswd = input('please input the password :') with open('mess',mode='r+',encoding='utf-8')as f1: for line in f1: a.append(line) a[0] = a[0].rstrip('\n') if user == a[0] and pswd == a[1] : print('登陸成功!') break else: print('登陸失敗') i += 1
下麵是3到關於文件的作業題:
1. 文件a.txt內容:每一行內容分別為商品名字,價錢,個數。 apple 10 3 tesla 100000 1 mac 3000 2 lenovo 30000 3 chicken 10 3 通過代碼,將其構建成這種數據類型:[{'name':'apple','price':10,'amount':3},{'name':'tesla','price':1000000,'amount':1}......] 並計算出總價錢。 li = [] with open('a',mode='r',encoding='utf-8') as f1 : for line in f1 : le = line.strip().split() if len(le) != 0 : lisl = {'name':le[0],'price':le[1],'amount':le[2]} li.append(lisl) print(li) num = 0 for lis in li: num = num + int(lis['price']) * int(lis['amount']) print(num) 2,有如下文件: ------- alex是老男孩python發起人,創建人。 alex其實是人妖。 誰說alex是sb? 你們真逗,alex再牛逼,也掩飾不住資深屌絲的氣質。 ---------- 將文件中所有的alex都替換成大寫的SB。 with open('b',mode='r+',encoding='utf-8') as f1 : for i in f1: if 'alex' in i : i = i.replace('alex','SB') print(i) 3.進行文件的修改操作: with open('text01',encoding='utf-8') as f1 ,open('text02','w',encoding='utf-8') as f2: for line in f1: if '你好啊' in line : line = line.replace('你好啊','hello') f2.write(line) import os os.remove('text01') os.rename('text02','text01')
之後我將開啟自己Python的函數之旅..........