1. 程式人生 > >Python入門篇(五)之文件操作和字符編碼

Python入門篇(五)之文件操作和字符編碼

Python 文件操作和字符編碼

1、文件操作

1、文件操作流程:

打開文件,得到文件句柄並賦值給一個變量===>  file = open("yesterday",encoding="utf-8")
通過句柄對文件進行操作
關閉文件 ==>  file.close()

1.2、打開文件的模式

r,只讀模式(默認)。
w,只寫模式。【不可讀;不存在則創建;存在則刪除內容;】
a,追加模式。【可讀;   不存在則創建;存在則只追加內容;】
"+" 表示可以同時讀寫某個文件

r+,可讀寫文件。【可讀;可寫;可追加】
w+,寫讀----->沒啥卵用
a+,同a
"U"表示在讀取時,可以將 \r \n \r\n自動轉換成 \n (與 r 或 r+ 模式同使用)

rU
r+U
"b"表示處理二進制文件(如:FTP發送上傳ISO鏡像文件,linux可忽略,windows處理二進制文件時需標註)

rb--->二進制文件讀取,二進制文件必須使用二進制模式打開
wb
ab

不同模式使用練習:
書寫一個文件,內容如下:

我愛北京天安門
北京天安門上太陽升

data = open("yestday",encoding="utf-8").read()  --->全部讀取,默認為r(只讀模式)
print(data)

執行結果:
我愛北京天安門
北京天安門上太陽升

*******************************************************************************************
當模式更改為只寫模式時,會提示報錯,不可讀,並且會將yestday文件內容清空
data = open("yestday",‘w‘,encoding="utf-8").read()
print(data)

執行結果:
io.UnsupportedOperation: not readable

*******************************************************************************************
data = open("yestday",‘a‘,encoding="utf-8")
data.write("\nwelcome")

執行結果:無返回值,可以查看yestday文件是否在尾部增加了welcome的字符

*******************************************************************************************
yestday文件內容:
You Are My Baby!
Come on!!!
Come on!!!
Come on!!!
welcome

data = open("yestday",‘r+‘,enconding="utf-8")
print(data.readline())
print(data.readline())
data.write("\nBeiJing")

執行結果:
You Are My Baby!

Come on!!!
查看yestday文件內容:
You Are My Baby!
Come on!!!
Come on!!!
Come on!!!
welcome
BeiJing

★★r+讀寫模式,只能在尾部追加,無法在文件內部進行插入,比如上面先讀取了2行,再寫入BeiJing,查看文件的變化是在尾部增加了該字符串。

1.3、file對象常用函數

file對象使用open函數來創建,以下為file對象常用的函數:

序號 方法 描述
1 file.close() 關閉文件。關閉後文件不能再進行讀寫操作。
2 file.flush() 刷新文件內部緩沖,直接把內部緩沖區的數據立刻寫入文件, 而不是被動的等待輸出緩沖區寫入。
3 file.fileno() 返回一個整型的文件描述符(file descriptor FD 整型), 可以用在如os模塊的read方法等一些底層操作上。
4 file.isatty() 如果文件連接到一個終端設備返回 True,否則返回 False。
5 file.next() 返回文件的下一行
6 file.read([size]) 從文件讀取指定的字節數,如果未給定或為負則讀取所有。
7 file.readline([size]) 讀取整行,包括 "\n" 字符。
8 file.seek() 設置文件的當前位置
9 file.tell() 返回文件的當前位置
10 file.truncate([size]) 從文件的首行首字符開始截斷,截斷文件為 size 個字符,無 size 表示從當前位置截斷;截斷之後 V 後面的所有字符被刪除,其中 Widnows 系統下的換行代表2個字符大小。
11 file.write(str) 將字符串寫入文件,沒有返回值
12 file.writelines(sequence) 向文件寫入一個序列字符串列表,如果需要換行則要自己加入每行的換行符。

進度條練習:---->使用flush刷新緩沖區

import sys,time
for i in range(10):
    sys.stdout.write("#")
    sys.stdout.flush()
    time.sleep(0.1)

執行結果:
##########

文件的修改練習:---->通過將修改的內容保存到一個新的文件當中
文件內容如下:
我愛北京天安門
天安門上太陽升
張傑
林俊傑
周傑倫

file = open("yestday","r",encoding="utf-8")
filenew = open("yestdaynew",‘w‘,encoding="utf-8")
for line in file:
    if "張傑" in line:
        line = line.replace("張傑","謝娜")
    filenew.write(line)
file.close()
filenew.close()

執行結果:
生成了yestdaynew文件,內容如下:
我愛北京天安門
天安門上太陽升
謝娜
林俊傑
周傑倫

1.4、with語句

為了避免打開文件後忘記關閉,可以通過管理上下文,即:
with open(‘log‘,‘r‘) as f:
如此方式,當with代碼塊執行完畢時,內部會自動關閉並釋放文件資源。
在Python 2.7 後,with又支持同時對多個文件的上下文進行管理,即:
with open(‘log1‘) as obj1, open(‘log2‘) as obj2:

with open("yestday",‘r‘,encoding="utf-8") as file:
    for line in file:
        print(line)

執行結果:
我愛北京天安門

天安門上太陽升

張傑

林俊傑

周傑倫

with open("yestday",‘r‘,encoding="utf-8") as file ,        open("yestday",‘r‘,encoding="utf-8") as file2:
    for line in file2:
        print(line)

執行結果:
我愛北京天安門

天安門上太陽升

張傑

林俊傑

周傑倫

2、字符編碼和轉碼

詳細文章:
python編碼終極版

2.1需知

1.在python2默認編碼是ASCII, python3裏默認是unicode

[root@web01 ~]# python
Python 2.7.5 (default, Aug  4 2017, 00:39:18) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print(sys.getdefaultencoding())
ascii

C:\Users\Administrator>python
Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AM
D64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print(sys.getdefaultencoding())
utf-8
>>>

2.unicode 分為 utf-32(占4個字節),utf-16(占兩個字節),utf-8(占1-4個字節), 所以 utf-16就是現在最常用的unicode版本, 不過在文件裏存的還是utf-8,因為utf8省空間

3.在py3中encode,在轉碼的同時還會把string 變成bytes類型,decode在解碼的同時還會把bytes變回string

技術分享圖片

4.Unicode與utf8的關系:
一言以蔽之:Unicode是內存編碼表示方案(是規範),而UTF是如何保存和傳輸Unicode的方案(是實現)這也是UTF與Unicode的區別。

in python 2.x
#author = KIM
#-*-coding:utf-8-*-  -->申明編碼的方式為utf-8

import sys
print(sys.getdefaultencoding())  -->python 2.x中默認的編碼是ascii

msg = "你好"

msg_to_gbk = msg.decode("utf-8").encode("gbk")
print(msg_to_gbk)

執行結果:
[root@web01 ~]# python encode.py 
ascii
?o --->亂碼

此處將utf-8編碼轉為gbk的編碼過程:msg解碼(decode)為unicode,再編碼(encode)為gbk。而默認的的編碼格式為utf-8,gbk格式明文顯示會出現亂碼。

in python 3.x
import sys
print(sys.getdefaultencoding()) 

msg = "我愛北京天安門"
msg_gbk = msg.encode("gbk")  -->默認就是unicode,不需要decode
msg_utf8 = msg.encode("utf-8")
msg_unicode = msg.encode("gbk").decode("gbk")

print(msg_gbk)
print(msg_utf8 )
print(msg_unicode)

執行結果:
utf-8
b‘\xce\xd2\xb0\xae\xb1\xb1\xbe\xa9\xcc\xec\xb0\xb2\xc3\xc5‘
b‘\xe6\x88\x91\xe7\x88\xb1\xe5\x8c\x97\xe4\xba\xac\xe5\xa4\xa9\xe5\xae\x89\xe9\x97\xa8‘
我愛北京天安門

Python入門篇(五)之文件操作和字符編碼