python文件操作解码_python基础3之文件操作、字符编码解码、函数介绍
內(nèi)容概要:
一、文件操作
二、字符編碼解碼
三、函數(shù)介紹
一、文件操作
文件操作流程:
打開(kāi)文件,得到文件句柄并賦值給一個(gè)變量
通過(guò)句柄對(duì)文件進(jìn)行操作
關(guān)閉文件
基本操作:
1 #/usr/bin/env python
2 #-*- coding:utf-8 -*-
3 #Author:W-D
4 f=open("test","r",encoding="utf-8")#打開(kāi)文件,并告訴解釋器以那種編碼打開(kāi),編碼不對(duì)會(huì)報(bào)錯(cuò)
5 data=f.read()#操作文件
6 print(data)#打印文件內(nèi)容
7 f.close()#關(guān)閉文件
View Code
打開(kāi)文件模式:
r ,只讀模式【默認(rèn)】
w,只寫(xiě)模式【不可讀:不存在則創(chuàng)建;存在則清空內(nèi)容;】
x, 只寫(xiě)模式【不可讀:不存在則創(chuàng)建,存在則報(bào)錯(cuò)】
a, 追加模式【不可讀;不存在則創(chuàng)建;存在則只追加內(nèi)容;】
“+”表示同時(shí)讀寫(xiě)某個(gè)文件,特別注意在操作文件過(guò)程中明白文件指針的位置,稍后我會(huì)舉例子說(shuō)明文件針的問(wèn)題。
r+,可讀寫(xiě)文件【可讀;可寫(xiě);可追加】
w+,寫(xiě)讀
a+,追加讀
"b"表示處理二進(jìn)制文件,意思是"b"類(lèi)型打開(kāi)的文件讀的內(nèi)容是字節(jié)類(lèi)型(bytes),若寫(xiě)入文件也需要是字節(jié)類(lèi)型,需要通過(guò)bytes進(jìn)行轉(zhuǎn)化。(如:FTP發(fā)送上傳ISO鏡像文件,linux可忽略,windows處理二進(jìn)制文件時(shí)需標(biāo)注)
rb
wb
ab
"U"表示在讀取時(shí),可以將 \r \n \r\n自動(dòng)轉(zhuǎn)換成 \n (與 r 或 r+ 模式同使用),在python3中該模式已經(jīng)廢棄了,2.x版本中保留。
rU
r+U
示列一(r+模式):
下面著重說(shuō)明文件指針和讀寫(xiě)文件的關(guān)系,同時(shí)演示下以“b”模式打開(kāi)的文件讀寫(xiě)操作。
文件內(nèi)容:
You were the shadow to my light
Did you feel us
Another Star
You fade away
Afraid our aimisout of sight
Wanna see us
Alive
Where are you now
Where are you now
Where are you now
示例代碼:
#f.tell() 讀取當(dāng)前文件指針位置,單位為字符#f.seek() 重新偏移指針位置,參數(shù)為整數(shù)#f.readline()表示讀取一行#/usr/bin/env python#-*- coding:utf-8 -*-#Author:W-D
f=open("test","r+",encoding="utf-8")print(f.tell())#打印開(kāi)始的指針位置
data=f.readline()#讀取第一行數(shù)據(jù)放在data里
print(len(data),data)#打印數(shù)據(jù)長(zhǎng)度內(nèi)容
print(f.tell())#打印當(dāng)前指針位置
f.write("我")#寫(xiě)文件內(nèi)容
print(f.tell())#打印指針位置
f.close()#關(guān)閉文件
結(jié)果:
028were the shadow to my light29
186修改后的文件變?yōu)?#xff1a;
were the shadow to my light
Did you feel us
Another Star
You fade away
Afraid our aimisout of sight
Wanna see us
Alive
Where are you now
Where are you now
Where are you now我
View Code
結(jié)果分析:上述結(jié)果表明,以r+模式打開(kāi)文件,一開(kāi)始文件指針在0,但讀取一部分內(nèi)容后文件指針后移動(dòng),當(dāng)使用write方法寫(xiě)文件時(shí)候,文件指針移到了末尾變成最后追加的方式,而并不是在讀取文件時(shí)候的指針位置直接寫(xiě)。
示列二(以r+b):細(xì)心的小伙伴可以發(fā)現(xiàn)同樣有r+模式,都是讀取后再寫(xiě)內(nèi)容,但是以“r+”模式指針移到了最后,追加寫(xiě),而以“r+b”則指針不動(dòng),接著覆蓋文件內(nèi)容寫(xiě)。
#/usr/bin/env python#-*- coding:utf-8 -*-#Author:W-D
f=open("test","r+b")#以b模式打開(kāi)已經(jīng)確定了編碼不需要在寫(xiě)encoding
print(f.tell())
data=f.readline()print(type(data),data)print(f.tell())
f.write(bytes("我",encoding="utf-8"))#將字符串轉(zhuǎn)化為bytes類(lèi)型
print(f.tell())
f.close()
結(jié)果:
0 b'were the shadow to my light\r\n'#可以看見(jiàn)內(nèi)容為bytes類(lèi)型
29
32
View Code
附上處理文件時(shí)候使用的常用方法:
1 file.close() #關(guān)閉文件。關(guān)閉后文件不能再進(jìn)行讀寫(xiě)操作。
2
3 file.flush() #刷新文件內(nèi)部緩沖,直接把內(nèi)部緩沖區(qū)的數(shù)據(jù)立刻寫(xiě)入文件, 而不是被動(dòng)的等待輸出緩沖區(qū)寫(xiě)入。
4
5 file.fileno() #返回一個(gè)整型的文件描述符(file descriptor FD 整型), 可以用在如os模塊的read方法等一些底層操作上。
6
7 file.isatty() #如果文件連接到一個(gè)終端設(shè)備返回 True,否則返回 False。
8
9 file.next() #返回文件下一行(迭代器)。
10
11 file.read([size]) #從文件讀取指定的字節(jié)數(shù),如果未給定或?yàn)樨?fù)則讀取所有。
12
13 file.readline([size]) #讀取整行,包括 "\n" 字符。
14
15 file.readlines([sizehint]) #讀取所有行并返回列表,若給定sizeint>0,返回總和大約為sizeint字節(jié)的行, 實(shí)際讀取值可能比sizhint較大, 因?yàn)樾枰畛渚彌_區(qū)。
16
17 file.seek(offset[, whence]) #設(shè)置文件當(dāng)前位置
18
19 file.tell() #返回文件當(dāng)前位置。
20
21 file.truncate([size]) #截取文件,截取的字節(jié)通過(guò)size指定,默認(rèn)為當(dāng)前文件位置。
22
23 file.write(str) #將字符串寫(xiě)入文件,沒(méi)有返回值。
24
25 file.writelines(list) #向文件寫(xiě)入一個(gè)序列字符串列表,如果需要換行則要自己加入每行的換行符。
文件內(nèi)容循環(huán):
在對(duì)文件的操作過(guò)程中,最多的就是讀取并處理文件內(nèi)容,當(dāng)文件很大的時(shí)候,使用read方法一次性讀取是非常不明智的,不僅處理慢,還耗內(nèi)存,此時(shí)我們可以使用for循環(huán)處理。
#/usr/bin/env python#-*- coding:utf-8 -*-#Author:susu
f=open("test","r+",encoding="utf-8")for line in f:#一行一行循環(huán)讀取
print(line.strip())#打印
結(jié)果:
You were the shadow to my light
Did you feel us
Another Star
You fade away
Afraid our aimisout of sight
Wanna see us
Alive
Where are you now
tps:使用flush實(shí)現(xiàn)進(jìn)度條效果
原理:
使用sys.stdout.write()方法向窗口輸入字符(不換行),在使用flush強(qiáng)制刷新內(nèi)存,打印在輸出控制臺(tái)上。
預(yù)備知識(shí):
先說(shuō)一下文本系統(tǒng)的控制符:
#/usr/bin/env python#-*- coding:utf-8 -*-#Author:susu
importsys,timefor i in range(1,101):
num="="*i#設(shè)置每次打印=好的數(shù)量,數(shù)量一定要增加
sys.stdout.write("\r{}>%{}".format(num,i))#"\r"表示每次打印現(xiàn)將光標(biāo)移動(dòng)到最前面打印
sys.stdout.flush()
time.sleep(0.5)
關(guān)于with
為避免我們打開(kāi)了文件進(jìn)行操作以后沒(méi)有關(guān)閉,使用with打開(kāi)文件會(huì)自動(dòng)調(diào)用close()方法關(guān)閉文件,同時(shí)在python2.7以后with也提供了同時(shí)打開(kāi)多個(gè)文件的上下文管理。
示列:修改文件
1 #/usr/bin/env python
2 #-*- coding:utf-8 -*-
3 #Author:susu
4 with open("test","r",encoding="utf-8") as f1,\
open("new.txt","w",encoding="utf-8") as f2:5 for line inf1:6 f2.write(line)#將f1(test)文件內(nèi)容寫(xiě)入到f2(new.txt)中
二、字符編碼解碼
首先需要了解的知識(shí):
1.在python2x中默認(rèn)字符編碼是ASCII, 而在python3里默認(rèn)是utf-8
2.unicode 分為 utf-32(占4個(gè)字節(jié)),utf-16(占兩個(gè)字節(jié)),utf-8(占1-4個(gè)字節(jié)),utf-8就是unicode
3.在pyhton3中encode,在轉(zhuǎn)碼的同時(shí)還會(huì)把string 變成bytes類(lèi)型,decode在解碼的同時(shí)還會(huì)把bytes變回string
4.更多的編碼知識(shí)請(qǐng)參考http://www.cnblogs.com/yuanchenqi/articles/5956943.html
轉(zhuǎn)碼示列操作:
python2中:
1 #/usr/bin/env python
2 #-*- coding:utf-8 -*-
3 #Author:W-D
4 test="我來(lái)了"
5 new_test=test.decode("utf-8").encode("gbk")6 #decode必須制定當(dāng)前編碼,由于在腳本頭中指定當(dāng)前編碼為utf-8,如果腳本頭中沒(méi)有指定,會(huì)采用系統(tǒng)默認(rèn)編碼。
7 print(new_test)8 結(jié)果:9 我來(lái)了10
11 python2
View Code
在python3中由于默認(rèn)編碼改變,并且編碼的時(shí)候會(huì)將字符串轉(zhuǎn)為bytes類(lèi)型,若需要輸出為字符串類(lèi)型需要解碼。
1 #/usr/bin/env python
2 #-*- coding:utf-8 -*-
3 #設(shè)置文件編碼為utf-8,為了讓系統(tǒng)識(shí)別,如果系統(tǒng)文件編碼為gbk,該文件將不會(huì)被識(shí)別。
4 #Author:W-D
5 importsys6 print (sys.getdefaultencoding())#打印當(dāng)前系統(tǒng)默認(rèn)編碼(不一定是頭中聲明的編碼)
7 test="你好"#該變量的編碼是unicode(utf-8),文件編碼如果是gbk,該變量編碼依然不會(huì)改變
8 gbk_test=test.encode("gbk")#轉(zhuǎn)碼為gbk
9 print(gbk_test)#打印
10 print(gbk_test.decode("gbk").encode("utf-8"))#gbk轉(zhuǎn)utf-8
11 print(gbk_test.decode("gbk"))#將gbk解碼為unicode,變成字符串打印
12 結(jié)果:13 utf-8
14 b'\xc4\xe3\xba\xc3'
15 b'\xe4\xbd\xa0\xe5\xa5\xbd'
16 你好
View Code
三、函數(shù)介紹
1.為什么使用函數(shù)
減少重復(fù)代碼
使程序變的可擴(kuò)展
使程序變得易維護(hù)
2.語(yǔ)法
1 def函數(shù)名(參數(shù)):2 ...3 函數(shù)體4 ...5 返回值
簡(jiǎn)單示列:
1 #/usr/bin/env python
2 #-*- coding:utf-8 -*-
3 #Author:Susu
4 deftest(a):5 print("this is %s"%a)6 test("susu")#調(diào)用函數(shù)
7 結(jié)果:8 this is susu
3.函數(shù)參數(shù)與局部變量
Python函數(shù)的兩種類(lèi)型參數(shù),一種是函數(shù)定義里的形參,一種是調(diào)用函數(shù)時(shí)傳入的實(shí)參。
在函數(shù)的內(nèi)部,實(shí)參會(huì)被賦值給形參,下面的例子是一個(gè)用戶自定義的函數(shù),接收一個(gè)實(shí)參:
1 #coding=utf-8
2
3 defprint_twice(bruce):4 printbruce5 print bruce #python 函數(shù)返回值可以用return
這個(gè)函數(shù)的作用是:在調(diào)用的時(shí)候會(huì)把實(shí)參的值,給形參bruce,并將其輸出2次。
作為實(shí)參傳入到函數(shù)的變量名稱(chēng)和函數(shù)定義里形參的名字沒(méi)有關(guān)系。函數(shù)里面只關(guān)心形參的值,而不去關(guān)心它在調(diào)用前叫什么名字。
實(shí)參:可以是常量、變量、表達(dá)式、函數(shù)等
4.函數(shù)參數(shù)傳遞
在函數(shù)調(diào)用的時(shí)候,傳遞的參數(shù)有兩種,這兩種方式可以單獨(dú)使用,也可以混用,但是要注意一個(gè)原則關(guān)鍵字參數(shù)必須放在位置參數(shù)之后
1.位置參數(shù),按形參位置來(lái)傳遞
2.關(guān)鍵字參數(shù),按形參的參數(shù)名傳遞
示列:
1 #/usr/bin/env python
2 #-*- coding:utf-8 -*-
3 #Author:SU
4 defmsg(_name,_age,_city):5 print("name:{},age:{},city:{}".format(_name,_age,_city))6 name="SU"
7 age=22
8 city="beijing"
9 msg(name,age,city)#關(guān)鍵字參數(shù)傳遞
10 msg(_name=name,_age=age,_city=city)#位置參數(shù)傳遞
11 msg(name,_city=city,_age=age)#關(guān)鍵字和位置參數(shù)同時(shí)傳遞
12 結(jié)果:13 name:SU,age:22,city:beijing14 name:SU,age:22,city:beijing15 name:SU,age:22,city:beijing
View Code
5.設(shè)置默認(rèn)參數(shù)和非固定參數(shù)
設(shè)置默認(rèn)參數(shù):作用就是當(dāng)我們沒(méi)有傳遞該參數(shù)時(shí)候,調(diào)用函數(shù)會(huì)傳遞參數(shù)的默認(rèn)值,當(dāng)傳遞了該默認(rèn)參數(shù)的值時(shí)候,采用傳遞的值。
示列:
1 #/usr/bin/env python
2 #-*- coding:utf-8 -*-
3 #Author:W-D
4 def test(age,name="WD"):#設(shè)置name默認(rèn)值是SU
5 print(name,age)6 test(22) #未傳遞name
7 test(22,"alex")#傳遞name
8 結(jié)果:9 SU 22
10 alex 22
View Code
非固定參數(shù):若函數(shù)在定義時(shí)不確定調(diào)用時(shí)候想傳入多少個(gè)參數(shù),就可以使用非固定參數(shù)
語(yǔ)法:
1.*參數(shù)(如*args),該形式會(huì)將傳入的參數(shù)當(dāng)作數(shù)組處理
示列:
1 #/usr/bin/env python
2 #-*- coding:utf-8 -*-
3 #Author:susu
4 def test(name,age,*args):5 print(name,age,args)6 print(type(args))7 test("susu",25,"a","b","c")8 test("jack",38)9 結(jié)果:10 wd 25 ('a', 'b', 'c')#將參數(shù)作為一個(gè)tuple
11
12 jack 38 ()#不傳參數(shù)就作為空tuple
13
View Code
2.**參數(shù)(如**kwargs),該形式會(huì)將傳入的參數(shù)作為字典處理
示列:
#/usr/bin/env python#-*- coding:utf-8 -*-#Author:susu
def test(name,age,**kwargs):print(name,age,kwargs)print(type(kwargs))
test("susu",25,jack=22,job="it")#傳遞的時(shí)候key相當(dāng)于變量=號(hào)后是值
結(jié)果:
susu25 {'job': 'it', 'jack': 22}
6.全局變量與局部變量(這變量為數(shù)字,字符串,后面會(huì)提及當(dāng)變量數(shù)據(jù)類(lèi)型比較高級(jí)的時(shí)候,情況不一樣了)
在子程序中定義的變量稱(chēng)為局部變量,在程序的一開(kāi)始定義的變量稱(chēng)為全局變量。
全局變量作用域是整個(gè)程序,局部變量作用域是定義該變量的子程序。
當(dāng)全局變量與局部變量同名時(shí),在定義局部變量的子程序內(nèi),局部變量起作用,在其它地方全局變量起作用。
示列:
#/usr/bin/env python#-*- coding:utf-8 -*-#Author:susu
name ="su"
defchange_name(name):print("before is %s" %name)
name="jack"#局部變量
print("after is %s" %name)
change_name("rose")print("finally is %s"%name)
結(jié)果:
beforeisrose
afterisjackfinally is su #未改變?nèi)肿兞?/p>
View Code
若要修改全局變量,必須首先使用global聲明(不推薦修改全局變量)
#/usr/bin/env python#-*- coding:utf-8 -*-#Author:susu
name ="su"#全局變量
defchange_name(_name):global name#聲明該變量是全局變量
print("before is %s" %_name)
name="jack"#局部變量
print("after is %s" %_name)
change_name("rose")print("finally is %s"%name)
結(jié)果:
beforeisrose
afterisrosefinally is jack#全局變量修改了
View Code
當(dāng)全局變量為列表,字典,集合,類(lèi)等這些數(shù)據(jù)類(lèi)型的時(shí)候,修改局部變量,同樣也修改了全局變量。
示列:
#/usr/bin/env python#-*- coding:utf-8 -*-#Author:susu
name =[1,2,3]#列表類(lèi)型的全局變量
defchange_name(_name):print("before is %s" %_name)
name[0]="修改了嗎"
print("after is %s" %_name)
change_name(name)print("finally is %s"%name)#打印全局變量
結(jié)果:
beforeis [1, 2, 3]
afteris ['修改了嗎', 2, 3]finally is ['修改了嗎', 2, 3] #修改了全局變量
View Code
7.返回值
如果在默寫(xiě)場(chǎng)景下,我們要想獲取函數(shù)的執(zhí)行結(jié)果,就可以用return語(yǔ)句把結(jié)果返回
注意:
函數(shù)在執(zhí)行過(guò)程中只要遇到return語(yǔ)句,就會(huì)停止執(zhí)行并返回結(jié)果,也可以理解為 return 語(yǔ)句代表著函數(shù)的結(jié)束
如果未在函數(shù)中指定return,那這個(gè)函數(shù)的返回值為None
返回值可以是字符串、數(shù)字、列表、甚至可以是函數(shù)
示例:
#/usr/bin/env python#-*- coding:utf-8 -*-#Author:Susu
defadd(x,y):print("%d+%d=%d" %(x,y,x+y))return x>y#返回x>y的結(jié)果
a=add(3,4)print(a)
結(jié)果:3+4=7False
View Code
總結(jié)
以上是生活随笔為你收集整理的python文件操作解码_python基础3之文件操作、字符编码解码、函数介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 新硬盘怎么设置启动系统安装系统安装不了
- 下一篇: 从装了电脑系统了怎么安装打印机驱动 如何