詳解python中的文件操作

1.能調(diào)用方法的一定是對(duì)象,比如數(shù)值、字符串、列表、元組、字典,甚至文件也是對(duì)象,Python中一切皆為對(duì)象。

str1='hello'

str2='world'

str3=' '.join([str1,str2])

print(str3)

2.三種基本的文件操作模式:r(only-read)、w(only-write)、a(append)

對(duì)文件進(jìn)行操作的流程:

第一,建立文件對(duì)象。

第二,調(diào)用文件方法進(jìn)行操作。

第三,不要忘了關(guān)閉文件。(文件不關(guān)閉的情況下,內(nèi)容會(huì)放在緩存,雖然Python會(huì)在最后自動(dòng)把內(nèi)容讀到磁盤,但為了以防萬(wàn)一,要養(yǎng)成關(guān)閉文件的習(xí)慣)

文件file1

一張褪色的照片,

好像帶給我一點(diǎn)點(diǎn)懷念。

巷尾老爺爺賣的熱湯面,

味道彌漫過(guò)舊舊的后院;

流浪貓睡熟在搖晃秋千,

夕陽(yáng)照了一遍他咪著眼;

那張同桌寄的明信片,

安靜的躺在課桌的里面。

(1)r模式:

f=open('file1','r') ? ? ? ?#read是逐字符地讀取,read可以指定參數(shù),設(shè)定需要讀取多少字符,無(wú)論一個(gè)英文字母還是一個(gè)漢字都是一個(gè)字符。

f_read=f.read()

print(f_read)

f.close()


f=open('file1','r')

f_read=f.readline()#readline只能讀取第一行代碼,原理是讀取到第一個(gè)換行符就停止。

print(f_read)

f.close()


f=open('file1','r')

f_read=f.readlines()#readlines會(huì)把內(nèi)容以列表的形式輸出。

print(f_read)

f.close()


f=open('file1','r')

forlineinf.readlines() ? ? #使用for循環(huán)可以把內(nèi)容按字符串輸出。

? ? ? ?print(line) ? ? ?#輸出一行內(nèi)容輸出一個(gè)空行,一行內(nèi)容一行空格... 因?yàn)槲募忻啃袃?nèi)容后面都有一個(gè)換行符,而且print()語(yǔ)句本身就可以換行,如果不想輸出空行,就需要使用下面的語(yǔ)句:print(line.strip())

f.close()


(2)w模式

在進(jìn)行操作前,文件中所有內(nèi)容會(huì)被清空。比如在file1中寫入'hello world',程序執(zhí)行后file1中就只剩下一句'hello world'


f=open('file1','w',encoding='utf8') ? ? ? ? ? ?#由于Python3的默認(rèn)編碼方式是Unicode,所以在寫入文件的時(shí)候需要調(diào)用utf8,以u(píng)tf8的方式保存,這時(shí)pycharm(默認(rèn)編碼方式是utf8)才能正確讀取,當(dāng)讀取文件時(shí),文件是utf8格式,pycharm也是utf8,就不需要調(diào)用了。

f_w=f.write('hello world')

print(f_w)#有意思的是,這里并不打印'hello world',只打印寫入多少字符

f.close()


(3)a模式

與w模式不同的是,a模式不會(huì)把原來(lái)內(nèi)容清空,而是光標(biāo)移到內(nèi)容最后位置,繼續(xù)寫入新內(nèi)容。比如在最后追加'hello world'

f=open('file1','a')

f_a=f.write('hello world')

print(f_a)#還是會(huì)打印寫入的字符數(shù)

f.close()

打印文件,在'流浪貓睡熟在搖晃秋千'后面加上'helloworld'輸出


在r模式時(shí),我們說(shuō)過(guò)用for循環(huán)和readlines()輸出文件內(nèi)容,這種輸出內(nèi)容的原理是:打開文件,把全部?jī)?nèi)容讀入內(nèi)存,然后再打印輸入,當(dāng)文件很大時(shí),這種讀取方式就不靠譜了,甚至?xí)箼C(jī)器崩潰。我們需要及時(shí)關(guān)閉文件,如下:

f=open('file','r')

data=f.readlines() ? ?#注意及時(shí)關(guān)閉文件

f.close()

num=0

? ? for ?i ?in ?data:

? ? ? ? ?num+=1

? ? ? ? ?if ?num == 5:

? ? ? ? ? ? i=''.join([i.strip(),'hello world'])#不要使用“+”進(jìn)行拼接

? ? ? ? ?print(i.strip())

f.close()


對(duì)于大數(shù)據(jù)文件,要使用下面的方法:

num=0

f.close()#不要過(guò)早關(guān)閉文件,否則程序不能識(shí)別操作句柄f.

f=open('file','r')

? ? ? for ?i ?in ?f: ? ? #for內(nèi)部把f變?yōu)橐粋€(gè)迭代器,用一行取一行。

? ? ? ? ? num+=1

? ? ? ? ? if ?num ?==5:

? ? ? ? ? ? ? i=''.join([i.strip(),'hello world'])

? ? ? ? ? print(i.strip())

f.close()

3.tell和seek

tell:查詢文件中光標(biāo)位置

seek:光標(biāo)定位

f=open('file','r')

print(f.tell()) ? ? ?#光標(biāo)默認(rèn)在起始位置

f.seek(10) ? ? ? #把光標(biāo)定位到第10個(gè)字符之后

print(f.tell()) ? ? #輸出10

f.close()

----------------------

f=open('file','w')

print(f.tell()) ? ? ?#先清空內(nèi)容,光標(biāo)回到0位置

f.seek(10)

print(f.tell())

f.close()

----------------------

f=open('file','a')

print(f.tell()) ? ? ? ?#光標(biāo)默認(rèn)在最后位置

f.write('你好 世界')

print(f.tell()) ? ? ? ?#光標(biāo)向后9個(gè)字符,仍在最后位置

f.close()

4.flush 同步將數(shù)據(jù)從緩存轉(zhuǎn)移到磁盤

示例,實(shí)現(xiàn)進(jìn)度條功能

importsys,time#導(dǎo)入sys和time模塊

for ? i ? in ? range(40):

? ? sys.stdout.write('*')

? ? sys.stdout.flush()#flush的作用相當(dāng)于照相,拍一張沖洗一張

? ? time.sleep(0.2)

下面代碼也能夠?qū)崿F(xiàn)相同的功能

importtime

for ? i ? in ? range(40):

print('*',end='',flush=True)#print中的flush參數(shù)

time.sleep(0.2)

5.truncate 截?cái)?/b>

不能是r模式下執(zhí)行,

w模式下,已經(jīng)清空所有數(shù)據(jù),使用truncate沒(méi)有任何意義,

a模式下,截?cái)嘀付ㄎ恢煤蟮膬?nèi)容。

f=open('file','a')

f.truncate(6)#只顯示6個(gè)字節(jié)的內(nèi)容(6個(gè)英文字符或三個(gè)漢字),后面的內(nèi)容被清空。

6.光標(biāo)位置總結(jié)

一個(gè)漢字兩個(gè)字節(jié),涉及光標(biāo)位置的方法有4個(gè):read、tell、seek、truncate。

#--------------------------光標(biāo)總結(jié)head-----------------------------------

f=open('file','r')

print(f.read(6)) ? #6個(gè)字符

print(f.tell()) ? ? ? #位置12字節(jié),一個(gè)漢字兩個(gè)字節(jié)

f.close()

f=open('file','r')

f.seek(6) ? ? ?#6個(gè)字節(jié)

print(f.tell())

f.close()

f=open('file','a')

print(f.tell()) ? ? ? #光標(biāo)默認(rèn)在最后位置

f.write('你好 世界')

print(f.tell()) ? ? ? ?#光標(biāo)向后9個(gè)字節(jié),一個(gè)漢字兩個(gè)字節(jié),仍在最后位置 182-->191

f.close()

f=open('file','a',encoding='utf-8')

print(f.truncate(6)) ? ? ? ? ? ? #由于需要光標(biāo)定位位置,所以也是字節(jié)。只顯示6個(gè)字節(jié)的內(nèi)容(6個(gè)英文字母或三個(gè)漢字,一個(gè)漢字兩個(gè)字節(jié)),后面的內(nèi)容被清空。

f.close()

#-----------------------------光標(biāo)總結(jié)end---------------------------------

7.另外3種模式:r+、w+、a+

r+:讀寫模式,光標(biāo)默認(rèn)在起始位置,當(dāng)需要寫入的時(shí)候,光標(biāo)自動(dòng)移到最后

w+:寫讀模式,先清空原內(nèi)容,再寫入,也能夠讀取

a+:追加讀模式,光標(biāo)默認(rèn)在最后位置,直接寫入,也能夠讀取。

f=open('file','a')

print(f.tell()) ? ?#末尾207位置

f.close()

f=open('file','r+')

print(f.tell()) ? ? ? #0位置

print(f.readline()) ? ? ?#讀取第一行

f.write('羊小羚') ? ? ? #光標(biāo)移到末尾207位置并寫入

print(f.tell()) ? ? ? ?#213位置

f.seek(0) ? ? ? ?#光標(biāo)移到0位置

print(f.readline()) ? ? ? #讀取第一行

f.close()

8.修改文件內(nèi)容

思路:由于數(shù)據(jù)存儲(chǔ)機(jī)制的關(guān)系,我們只能把文件1中的內(nèi)容讀取出來(lái),經(jīng)過(guò)修改后,放到文件2中。

f2=open('file2','w',encoding='utf8')#寫入的時(shí)候必須加utf8

f1=open('file','r')

num=0

forlineinf1:#迭代器

num+=1

ifnum==5:

line=''.join([line.strip(),'羊小羚\n'])#里面就是對(duì)字符串進(jìn)行操作了

f2.write(line)

f1.close()

f2.close()

9.with語(yǔ)句

可以同時(shí)對(duì)多個(gè)文件同時(shí)操作,當(dāng)with代碼塊執(zhí)行完畢時(shí),會(huì)自動(dòng)關(guān)閉文件釋放內(nèi)存資源,不用特意加f.close(),我們通過(guò)下面的示例體會(huì)with的用法和好處。

用with語(yǔ)句重寫8中的代碼

num=0

withopen('file','r') as f1,open('file2','w',encoding='utf8') as f2:

forlineinf1:

num+=1

ifnum==5:

line=''.join([line.strip(),'羊小羚'])

f2.write(line)

python ---IO文件操作 完O(∩_∩)O哈哈~

如何變色呢 ?這字體 ?簡(jiǎn)直醉了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程,因...
    小菜c閱讀 7,317評(píng)論 0 17
  • 學(xué)習(xí)處理文件和保存數(shù)據(jù)可以使程序使用起來(lái)更容易,用戶將能夠選擇輸入什么樣的數(shù)據(jù), 以及在什么時(shí)候輸入; 用戶使用你...
    路_堯知百戰(zhàn)勝閱讀 714評(píng)論 0 0
  • 1.1文件操作介紹 1.1.1什么是文件 1.1.2文件的作用 大家應(yīng)該聽說(shuō)過(guò)一句話:“好記性不如爛筆頭”。 不僅...
    西多的大叔閱讀 1,193評(píng)論 0 1
  • 一、流的概念和作用。 流是一種有順序的,有起點(diǎn)和終點(diǎn)的字節(jié)集合,是對(duì)數(shù)據(jù)傳輸?shù)目偝苫虺橄?。即?shù)據(jù)在兩設(shè)備之間的傳輸...
    布魯斯不吐絲閱讀 10,310評(píng)論 2 95
  • hey,我是黑洞 開始進(jìn)食 ? 一個(gè)月沒(méi)登錄后臺(tái)了,沒(méi)有任何變化。 這段時(shí)間過(guò)得挺喪的,距離絕望、懷疑、放棄只差0...
    吃不掉的黑洞閱讀 439評(píng)論 0 0

友情鏈接更多精彩內(nèi)容