Python入門篇(五)之文件操作和字符編碼
阿新 • • 發佈:2018-03-05
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入門篇(五)之文件操作和字符編碼