您好,登錄后才能下訂單哦!
這篇文章主要介紹了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='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
感謝你能夠認真閱讀完這篇文章,希望小編分享Python中文件操作的知識有哪些內容對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,遇到問題就找億速云,詳細的解決方法等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。