Python3--文件读取、写入、追加及seek()方法的使用
Python3--文件讀取、寫(xiě)入、追加及seek()方法的使用
一、讀取、寫(xiě)入、追加
在讀取、寫(xiě)入、追加數(shù)據(jù)之前,我們先導(dǎo)入os模塊(我們對(duì)文件系統(tǒng)的訪問(wèn)大多通過(guò)os模塊實(shí)現(xiàn))再將我們要使用的絕對(duì)路徑賦值給變量file_name、file_name2、file_name3.
# -*- coding: utf-8 -*- """ Created on Wed Aug 9 17:11:06 2017@author: goathow to read\write file """ import osbase_dir = os.getcwd() #獲取當(dāng)前文件夾的絕對(duì)路徑 file_name = os.path.join(base_dir, 'data', 'my_infor.txt') #拼接當(dāng)前目錄和data文件夾和my_infor.txt文件 file_name2 = os.path.join(base_dir, 'data', 'my_write.txt') file_name3 = os.path.join(base_dir, 'data', 'my_test.txt')1.使用readlines()方法讀取所有剩余行
my_open = open(file_name, 'r') # 若文件不存在,報(bào)錯(cuò),若存在,讀取 my_infor = my_open.readlines() #readlines()方法讀取所有剩余行,將他們作為一個(gè)字符串列表返回 my_open.close() #close()關(guān)閉文件,結(jié)束訪問(wèn) print(my_infor)
#===========================================
輸出結(jié)果如下:
['安徽財(cái)經(jīng)大學(xué)\n', '應(yīng)用統(tǒng)計(jì)\n', '大三\n', '19歲\n']#===========================================
2.使用文件迭代器每次讀取和顯示一行
my_open = open(file_name, 'r') # 若文件不存在,報(bào)錯(cuò),若存在,讀取 for eachline in my_open:print(eachline.strip()) #使用文本迭代器,每次讀取和顯示一行 #使用strip(rm)方法移除字符串頭尾指定的字符 #rm為需要?jiǎng)h除的字符 #當(dāng)rm為空時(shí),默認(rèn)刪除空白符(包括'\n', '\r', '\t', ' ') my_open.close()
#===========================================
輸出結(jié)果如下:
安徽財(cái)經(jīng)大學(xué)
應(yīng)用統(tǒng)計(jì)
大三
19歲
#===========================================3.寫(xiě)入數(shù)據(jù)
my_open = open(file_name2, 'w') #打開(kāi)fie_name2路徑下的my_write.txt文件,采用寫(xiě)入模式 #若文件不存在,創(chuàng)建,若存在,清空并寫(xiě)入 my_open.write('one\ntwo\n') #在文件中寫(xiě)入一個(gè)字符串 my_open.write('three\n') my_open.close()##檢查是否正確寫(xiě)入 my_open = open(file_name2, 'r') #讀取file_name2路徑下的my_write.txt文件 my_infor = my_open.readlines() my_open.close() print(my_infor)
#===========================================
輸出結(jié)果如下:
['one\n', 'two\n', 'three\n']
#===========================================4.追加數(shù)據(jù)
my_open = open(file_name, 'a') #打開(kāi)fie_name路徑下的my_infor.txt文件,采用追加模式 #若文件不存在,創(chuàng)建,若存在,追加 my_open.write('蚌埠\n') my_open.close()##檢查是否正確追加 my_open = open(file_name, 'r') #讀取file_name路徑下的my_write.txt文件 my_infor = my_open.readlines() my_open.close() print(my_infor)
#===========================================
輸出結(jié)果如下:
['安徽財(cái)經(jīng)大學(xué)\n', '應(yīng)用統(tǒng)計(jì)\n', '大三\n', '19歲\n', '蚌埠\n']
#===========================================二、seek()方法使用
seek()方法使用案例
my_open = open(file_name3, 'w+') #打開(kāi)fie_name3路徑下的my_test.txt文件,以讀寫(xiě)方式 #若文件不存在,創(chuàng)建,若存在,覆蓋 #實(shí)際上我們的確沒(méi)有這個(gè)文件 print('position_1 : ', my_open.tell()) #返回當(dāng)前在文件中的位置 my_open.write('line_1\n') print('position_2 : ', my_open.tell()) my_open.write('line_2\n') print('position_3 : ', my_open.tell())try:my_open.seek(-len('line_2\n'), 1)'''seek()可以在文件中移動(dòng)文件指針指針從whence(0 代表文件開(kāi)始 1 代表當(dāng)前位置 2 代表文件末尾)偏移off字節(jié)off為正往結(jié)束方向移動(dòng),為負(fù)往開(kāi)始方向移動(dòng)這里表示從當(dāng)前位置往開(kāi)始方向移動(dòng)8字節(jié)'''print('position_4 : ', my_open.tell())read1 = my_open.readline()#從文件中讀取并返回一行print(read1, '\nposition_5 : ', my_open.tell())my_open.seek(off = 0, whence = 0)#回到最開(kāi)始read2 = my_open.readline()print(read2, '\nposition_6 : ', my_open.tell()) except IOError as e:print(e,'\n', '意為:對(duì)于非二進(jìn)制的文本文件,不允許使用偏移定位。')print('position_4 : ', my_open.tell())my_open.close()#===========================================
輸出結(jié)果如下:
position_1 :? 0
position_2 :? 8
position_3 :? 16
can't do nonzero cur-relative seeks
?意為:對(duì)于非二進(jìn)制的文本文件,不允許使用偏移定位。
position_4 :? 16
#===========================================為了解決這種情況,我們建立一個(gè)二進(jìn)制文件
my_open = open(file_name3, 'wb+') #讀寫(xiě)打開(kāi)或建立一個(gè)二進(jìn)制文件,允許讀和寫(xiě) print('position_1 : ', my_open.tell())try:my_open.write('line_1\n')print('position_2 : ', my_open.tell())my_open.write('line_2\n')print('position_3 : ', my_open.tell())my_open.seek(-len('line_2\n'), 1)print('position_4 : ', my_open.tell())read1 = my_open.readline()print(read1, '\nposition_5 : ', my_open.tell())my_open.seek(off = 0, whence = 0)read2 = my_open.readline()print(read2, '\nposition_6 : ', my_open.tell()) except TypeError as e:print(e, '\n','意為:需要的是一個(gè)字節(jié)的對(duì)象,不是“str”') my_open.close() #===========================================
輸出結(jié)果如下:
position_1 :? 0
a bytes-like object is required, not 'str'
?意為:需要的是一個(gè)字節(jié)的對(duì)象,不是“str”
#===========================================Python文件使用“wb+”方式打開(kāi),寫(xiě)入字符串會(huì)報(bào)錯(cuò),因?yàn)檫@種打開(kāi)方式為:以二進(jìn)制格式打開(kāi)一個(gè)文件只用于寫(xiě)入。
如果該文件已存在則將其覆蓋。如果該文件不存在,創(chuàng)建新文件。所以寫(xiě)入的字符類型需為二進(jìn)制格式,如:
f.write("hello".encode('ascii'))
寫(xiě)入的編碼范圍不為128以內(nèi),就不能使用ascii了
如:
fh.write("漢字".encode('UTF-8'))
my_open = open(file_name3, 'wb+') print('position_1 : ', my_open.tell()) my_open.write('line_1\n'.encode('ascii')) print('position_2 : ', my_open.tell()) my_open.write('line_2\n'.encode('ascii')) print('position_3 : ', my_open.tell()) my_open.seek(-len('line_2\n'), 1) print('position_4 : ', my_open.tell()) read1 = my_open.readline() print(read1, '\nposition_5 : ', my_open.tell()) my_open.seek(0, 0) read2 = my_open.readline() print(read2, '\nposition_6 : ', my_open.tell()) my_open.close() ##檢查是否正確寫(xiě)入 my_open = open(file_name3, 'r') #讀取file_name3路徑下的my_test.txt文件 my_infor = my_open.readlines() my_open.close() print(my_infor)
#===========================================
輸出結(jié)果如下:
position_1 :? 0
position_2 :? 7
position_3 :? 14
position_4 :? 7
b'line_2\n'
position_5 :? 14
b'line_1\n'
position_6 :? 7
##檢查是否正確寫(xiě)入
['line_1\n','line_2\n']#===========================================
終于可以使用seek()方法了,現(xiàn)在我們打開(kāi)my_test.txt,查看輸出結(jié)果,如下圖所示:
發(fā)現(xiàn)文件里并沒(méi)有換行,這是因?yàn)?#xff1a;文本模式下打開(kāi)文件寫(xiě)入時(shí),換行用\n即可以了。在使用二進(jìn)制模式打開(kāi)文件,寫(xiě)入的時(shí)候,換行請(qǐng)使用\r\n?
my_open = open(file_name3, 'wb+') print('position_1 : ', my_open.tell()) my_open.write('line_1\r\n'.encode('ascii')) print('position_2 : ', my_open.tell()) my_open.write('line_2\r\n'.encode('ascii')) print('position_3 : ', my_open.tell()) my_open.seek(-len('line_2\r\n'), 1) print('position_4 : ', my_open.tell()) read1 = my_open.readline() print(read1, '\nposition_5 : ', my_open.tell()) my_open.seek(0, 0) read2 = my_open.readline() print(read2, '\nposition_6 : ', my_open.tell()) my_open.close()##檢查是否正確寫(xiě)入 my_open = open(file_name3, 'r') #讀取file_name3路徑下的my_test.txt文件 my_infor = my_open.readlines() my_open.close() print(my_infor)
#===========================================
輸出結(jié)果如下:
position_1 :? 0
position_2 :? 8
position_3 :? 16
position_4 :? 8
b'line_2\r\n'
position_5 :? 16
b'line_1\r\n'
position_6 :? 8
##檢查是否正確寫(xiě)入
['line_1\n','line_2\n']#===========================================
打開(kāi)my_test.txt,如下圖所示:
好了,累死寶寶了,表示自己原理什么的完全不懂,如有錯(cuò)誤請(qǐng)求提出!
參考文獻(xiàn):
文件使用二進(jìn)制模式打開(kāi)情況下的換行的方法
http://blog.csdn.net/fdl19881/article/details/7327106
Python文件使用“wb”方式打開(kāi),寫(xiě)入內(nèi)容
http://www.cnblogs.com/biyuting/p/5955750.html
fopen與讀寫(xiě)的標(biāo)識(shí)r,r+,rb+,rt+,w+.....
http://blog.csdn.net/cyforce/article/details/6159989
python文件打開(kāi)方式詳解——a、a+、r+、w+區(qū)別
http://blog.csdn.net/ztf312/article/details/47259805
使用os模塊來(lái)獲取當(dāng)前文件的絕對(duì)路徑和拼接路徑
https://zhidao.baidu.com/question/360101661090517412.html?qbl=relate_question_1&word=python%CF%E0%B6%D4%C2%B7%BE%B6%CF%C2%D2%BB%BC%B6
總結(jié)
以上是生活随笔為你收集整理的Python3--文件读取、写入、追加及seek()方法的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 10万存死期3年利息多少
- 下一篇: python sort、sorted 高